Java不允许我们做的原因是什么
private T[] elements = new T[initialCapacity];
我可以理解 .NET 不允许我们这样做,因为在 .NET 中,值类型在运行时可以具有不同的大小,但在 Java 中,所有类型的 T 都将是对象引用,因此具有相同的大小(如我错了请纠正我)。
是什么原因?
原文由 devoured elysium 发布,翻译遵循 CC BY-SA 4.0 许可协议
Java不允许我们做的原因是什么
private T[] elements = new T[initialCapacity];
我可以理解 .NET 不允许我们这样做,因为在 .NET 中,值类型在运行时可以具有不同的大小,但在 Java 中,所有类型的 T 都将是对象引用,因此具有相同的大小(如我错了请纠正我)。
是什么原因?
原文由 devoured elysium 发布,翻译遵循 CC BY-SA 4.0 许可协议
引用:
泛型数组是不允许的,因为它们不可靠。问题是由于 Java 数组的交互,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
原文由 Bart Kiers 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
这是因为 Java 的数组(与泛型不同)在运行时包含有关其组件类型的信息。所以在创建数组的时候一定要知道组件的类型。由于您不知道
T
在运行时是什么,因此您无法创建数组。