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

新手上路,请多包涵

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

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

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

是什么原因?

原文由 devoured elysium 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 574
2 个回答

这是因为 Java 的数组(与泛型不同)在运行时包含有关其组件类型的信息。所以在创建数组的时候一定要知道组件的类型。由于您不知道 T 在运行时是什么,因此您无法创建数组。

原文由 newacct 发布,翻译遵循 CC BY-SA 2.5 许可协议

引用:

泛型数组是不允许的,因为它们不可靠。问题是由于 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题