- java支援建立持有泛型的數組對象:
public static void test04() {
class Peel<T> {
}
class Banana {
}
class Apple {
}
// 建立泛型數組:
Peel<Banana>[] peels = new Peel[10];
// 可以放Peel<Banana>對象:
peels[0] = new Peel<Banana>();
// 不能放Peel<Apple>對象:
//! peels[1] = new Peel<Apple>();
}
但是數組是協變類型的,即它支援向上轉型,一旦某個自定義泛型數組向上轉型為Object數組,那麼它就可以接收任何類型的對象,泛型數組就不存在任何意義了:
public static void test02() {
List<String>[] lists = new List[10];
lists[0] = new ArrayList<String>();
// List<String>[]不支援ArrayList<Integer>:
//! lists[1] = new ArrayList<Integer>();
Object[] objects = lists; // 向上轉型之後,就可以添加ArrayList<Integer>對象
objects[0] = new ArrayList<Integer>();
}
事實上,泛型容器總是比泛型數組更好的選擇。
- 在類或方法的内部,不能直接建立泛型數組:
class Peel<T> {
// Type parameter 'T' cannot be instantiated directly
// T不能直接執行個體化:
//! T[] t = new T[10];
// 可以先建立Object[]數組,再轉型:
Object[] objects = new Object[10];
T[] ts = (T[]) objects; // Unchecked cast: 'java.lang.Object[]' to 'T[]'
}