Java不允许我们这样做的原因是什么
private T[] elements = new T[initialCapacity];
我可以理解.NET不允许我们这样做,因为在.NET中你有值类型,在运行时可以有不同的大小,但在Java中,所有类型的T将是对象引用,因此具有相同的大小(如我错了请纠正我)。是什么原因?
发布于 2018-10-09 08:25:00
引用:
不允许使用泛型类型的数组,因为它们不是声音。问题是由于Java数组的交互,这些数组不是静态声音,而是动态检查的,使用泛型,这些泛型是静态的,不是动态检查的。以下是你如何利用这个漏洞:
class Box<T> { final T x; Box(T x) { this.x = x; } }
class Loophole { public static void main(String[] args) { Box<String>[] bsa = new Box<String>[3]; Object[] oa = bsa; oa[0] = new Box<Integer>(3); // error not caught by array store check String s = bsa[0].x; // BOOM! } }
曾提议使用被Tiger拒绝的静态安全阵列(又名Variance)来解决这个问题。
发布于 2018-10-09 09:22:28
这是不可能的原因是Java纯粹在编译器级别上实现其泛型,并且每个类只生成一个类文件。在运行时,编译的类需要使用相同的字节码处理它的所有用法。所以,new T[capacity]
完全不知道需要实例化什么类型。
https://stackoverflow.com/questions/-100002853
复制相似问题