Java 泛型的限制
- 泛型的限制
-
- 泛型的類型參數T 不能使用原始類型,應該是用原始類型的包裝類。
- 類型參數不能用于在方法中執行個體化其對象
- 不能使用靜态域
- 不能轉換類型
- 不能使用instanceof運算符
- 不能使用數組
- 不能使用異常
-
- 通用類不允許直接或間接擴充Throwable類。
- 在一個方法中,不允許捕獲一個類型參數的執行個體
- throws子句中允許使用類型參數。
泛型的限制
泛型的類型參數T 不能使用原始類型,應該是用原始類型的包裝類。
Box<int> stringBox = new Box<int>()
上面代碼(Box類 參見之前的内容)類型參數T 必須修改為Integer才不會報錯。
類型參數不能用于在方法中執行個體化其對象
public class GenericNoInstance {
public static void main(String[] args) throws InstantiationException,
IllegalAccessException {
Box<String> stringBox = new Box<String>();
add(stringBox, String.class);
}
//編譯報錯,不能使用執行個體
public static <T> void add(Box<T> box) {
// T item = new T();
// box.add(item);
}
//非要實作執行個體,就是用反射(這樣做 何必呢)
public static <T> void add(Box<T> box, Class<T> clazz)
throws InstantiationException, IllegalAccessException {
T item = clazz.newInstance();
box.setT(item);
System.out.println("Item has been added.");
}
}
不能使用靜态域
使用泛型時,類型參數不允許為靜态(static)。
由于靜态變量在對象之間共享,是以編譯器無法确定要使用的類型。
不能轉換類型
本來類型都不确定,你轉換個P喲。如果非要轉換,就轉換試試。但感覺沒有必要。
錯誤示例:
Box<Integer> integerBox = new Box<Integer>();
Box<Number> numberBox = new Box<Number>();
//下面用法是錯誤的
integerBox = (Box<Integer>)numberBox;
使用無界通配符進行參數化,到時可以轉換,但是沒有必要。
private static void add(Box<?> box){
Box<Integer> integerBox = (Box<Integer>)box;
}
不能使用instanceof運算符
不能使用數組
錯誤示例
Box<Integer>[] arrayOfLists = new Box<Integer>[2];
因為編譯器使用類型擦除,類型參數被替換為Object,使用者可以向數組添加任何類型的對象。但在運作時,代碼将無法抛出ArrayStoreException。
不能使用異常
通用類不允許直接或間接擴充Throwable類。
//The generic class Box<T> may not subclass java.lang.Throwable
class Box<T> extends Exception {}
//The generic class Box<T> may not subclass java.lang.Throwable
class Box1<T> extends Throwable {}
在一個方法中,不允許捕獲一個類型參數的執行個體
public static <T extends Exception, J>
void execute(List<J> jobs) {
try {
for (J job : jobs){}
// compile-time error
//Cannot use the type parameter T in a catch block
} catch (T e) {
// ...
}
}
throws子句中允許使用類型參數。
class Box<T extends Exception> {
private int t;
public void add(int t) throws T {
this.t = t;
}
public int get() {
return t;
}
}