我无法在Java中创建通用数组类型的原因是什么?

问题

Java不允许我们这样做的原因是什么

private T[] elements = new T[initialCapacity];

我可以理解.NET不允许我们这样做,因为在.NET中你有值类型,在运行时可以有不同的大小,但在Java中,所有类型的T将是对象引用,因此具有相同的大小(如我错了请纠正我)。

是什么原因?


#1 热门回答(168 赞)

这是因为Java的数组(与泛型不同)在运行时包含有关其组件类型的信息。因此,在创建阵列时必须知道组件类型。由于你不知道在运行时是什么T,因此无法创建数组。


#2 热门回答(122 赞)

引用:

不允许使用泛型类型的数组,因为它们不是声音。问题是由于Java数组的交互,这些数组不是静态声音,而是动态检查的,使用泛型,这些泛型是静态的,不是动态检查的。以下是如何利用这个漏洞:class Box <T> {
    最终T x;
    方框(T x){
        this.x = x;
    }
}

漏洞{
    public static void main(String [] args){
        Box <String> [] bsa = new Box <String> [3];
        对象[] oa = bsa;
        oa [0] =新Box <整数>(3); //错误未被数组存储检查捕获
        String s = bsa [0] .x; // BOOM!
    }
}
 我们曾提议使用被Tiger拒绝的静态安全阵列(又名Variance)来解决这个问题。 - gafter

(我相信它是Neal Gafter,但我不确定)

请在此处查看:http://forums.sun.com/thread.jspa?threadID=457033&forumID=316


#3 热门回答(36 赞)

由于未能提供合适的解决方案,你最终会得到更糟糕的恕我直言。

常见的工作如下。

T[] ts = new T[n];

被替换为(假设T扩展Object而不是另一个类)

T[] ts = (T[]) new Object[n];

我更喜欢第一个例子,但是更多的acedemic类型似乎更喜欢第二个,或者只是不喜欢它。

大多数为什么你不能只使用Object []的例子同样适用于List或Collection(支持),所以我认为它们是非常差的参数。

注意:这是Collections库本身无法在没有警告的情况下编译的原因之一。如果你在没有警告的情况下无法支持这个用例,那么使用泛型模型恕我直言就可以解决这个问题。