允许Java通用数组创建?

时间:2017-10-20 20:42:57

标签: java arrays generics

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中不允许使用泛型数组时允许使用上面的代码?请帮忙!

2 个答案:

答案 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之前的代码向后兼容。