- 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[]'
}