class jj<T> {
T ob;
jj(T ob) {
this.ob = ob;
}
void show() {
System.out.println(ob);
}}
class demo {
public static void main(String[] args) {
// jj<Integer>[] lol=new jj<Integer>[10];// Not Allowed
jj<Integer>[] lol = new jj[10];//But this is allowed why?
for (int i = 0; i < 10; ++i)
lol[i] = new jj<>(i * 10);
for (jj<Integer> x : lol)
x.show();
}
为什么在java中不允许使用泛型数组时允许使用上面的代码?请帮忙!
答案 0 :(得分:2)
允许使用通用数组。编译器会给你一个警告,因为泛型实现类型擦除意味着它们在运行时不存在。编译器在创建泛型引用时会给出警告,对于对象的类型,您需要有一个已构建的对象数组。
CAN&#39;这样做:
//SYNTAX ERROR
jj = new T[10];
但是可以做到这一点:
//This suppresses the unchecked-cast warning that the compiler will give
@SuppressWarnings("unchecked")
//Can't create a generic array but can create an Object array and cast it to be a //compatible type
T[] jj = (T[])new Object[10];
但是上面的代码中没有创建泛型数组,而是创建了一个类jj
的数组,其中包含泛型。
答案 1 :(得分:1)
允许代码,因为new jj[10]
不是通用数组(例如new T[10]
),而是原始jj
实例数组 - jj
及其通用参数省略。 new jj[10]
创建一个新的原始jj
数组,而不是jj<Integer>
的新数组。 Java允许强制将原始类型的实例分配给具有泛型参数的类型引用,如代码对jj<Integer>[] lol = new jj[10];
所做的那样。我相信这是为了与Java 5之前的代码向后兼容。