先看出錯的代碼:
public class Holder<T> {
private T value;
public Holder() {
}
public Holder(T value) {
this.value = value;
}
public void setValue(T value) {
this.value = value;
}
// 此處省略若干行。
}
Holder<Object> holder = new Holder<>("xxx");
看起來還好,但編譯的時候卻報錯:
Uncompilable source code - incompatible types
required: javax.xml.ws.Holder<java.lang.Object>
found: javax.xml.ws.Holder<java.lang.String>
老老實實把類型寫出來就沒問題:
Holder<Object> holder = new Holder<Object>("xxx");
如果非要用鑽石運算符的話,可以采取下列兩種方式之一:
// 使用默認構造器,再調用setValue 方法。
Holder<Object> holder = new Holder<>();
holder.setValue("xxx");
// 使用泛型通配符,但之後就不能調用setValue 了,否則編譯出錯。
Holder<? extends Object> holder = new Holder<>("xxx");
摘自 神奇好望角