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 许可协议
8 回答6.6k 阅读
4 回答714 阅读✓ 已解决
2 回答3.4k 阅读
3 回答1.9k 阅读✓ 已解决
1 回答2.2k 阅读✓ 已解决
1 回答2.1k 阅读✓ 已解决
1 回答974 阅读✓ 已解决
这是因为 Java 的数组(与泛型不同)在运行时包含有关其组件类型的信息。所以在创建数组的时候一定要知道组件的类型。由于您不知道
T
在运行时是什么,因此您无法创建数组。