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

2022-08-31 05:08:25

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

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

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

原因何在?


答案 1

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


答案 2

报价:

不允许使用泛型类型的数组,因为它们不健全。问题在于 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


推荐