我无法在 Java 中创建泛型数组类型的原因是什么?
2022-08-31 05:08:25
Java不允许我们这样做的原因是什么?
private T[] elements = new T[initialCapacity];
我可以理解.NET不允许我们这样做,因为在.NET中,你有在运行时可以具有不同大小的值类型,但在Java中,所有类型的T都将是对象引用,因此具有相同的大小(如果我错了,请纠正我)。
原因何在?
Java不允许我们这样做的原因是什么?
private T[] elements = new T[initialCapacity];
我可以理解.NET不允许我们这样做,因为在.NET中,你有在运行时可以具有不同大小的值类型,但在Java中,所有类型的T都将是对象引用,因此具有相同的大小(如果我错了,请纠正我)。
原因何在?
这是因为Java的数组(与泛型不同)在运行时包含有关其组件类型的信息。因此,在创建数组时必须知道组件类型。由于您不知道运行时是什么,因此无法创建数组。T
报价:
不允许使用泛型类型的数组,因为它们不健全。问题在于 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拒绝了。
-- 椽子
(我相信是Neal Gafter,但不确定)
在这里的上下文中看到它:http://forums.sun.com/thread.jspa?threadID=457033&forumID=316