Java 参数化类型数组

Java 参数化类型数组,java,generics,Java,Generics,我很难弄清楚在下面的RHS中需要什么类型参数 ArrayList<Pair<ParseNode,ParseNode>>[] nodes = new ArrayList[indexes.length]; ArrayList[]节点=新的ArrayList[index.length]; 为什么的副本不合法 Java不支持通用数组。数组是协变的,泛型不是。这意味着如果类A扩展了类B,那么A[]也是B[]。和代码 A[] a = new A[10]; B[] b = a;

我很难弄清楚在下面的RHS中需要什么类型参数

ArrayList<Pair<ParseNode,ParseNode>>[] nodes = new ArrayList[indexes.length];
ArrayList[]节点=新的ArrayList[index.length];

为什么
的副本不合法

Java不支持通用数组。数组是协变的,泛型不是。这意味着如果类A扩展了类B,那么A[]也是B[]。和代码

A[] a = new A[10];
B[] b = a;
这是合法的

但泛型的情况不同。即使T扩展了X,也不能将
Foo
分配给
Foo
,因此不能保证
Foo[]
的元素是类型安全的

编辑
请原谅我只是链接一下,但我找到了一篇文章,它比我想象的更好地解释了关于数组协方差的一切

混凝土参数化类型的阵列固有地被破坏。请记住,数组是协变的,数组类型检查是一个运行时操作。在运行时,所有泛型都已被类型擦除,因此数组存储检查无法区分

泛型的基本约定是“我,编译器,承诺如果您编写的代码不生成警告,您将永远不会在运行时得到类强制转换异常。”

编译器也不能向您保证,如果将非
ArrayList
的内容放入该数组中,它将能够给您一个编译时错误。如果您添加了错误的类型,运行时系统也不能保证您将获得ArrayStoreException(就像语言规范所说的那样),而不是在稍后将其取出时获得ClassCastException。(第二部分是为什么它实际上是非法的,而不仅仅是一个警告,它将导致一个不符合语言规范的数组。)


因此,它不允许您以这种方式声明它们,并强制您承认“不安全”警告。这样,它就说“我告诉过你,我不能保证使用这个数组不会导致任何类强制转换异常,你要确保你只在这里放正确的东西。”

不要使用数组。使用另一个ArrayList

ArrayList<List<Pair<ParseNode,ParseNode>>> listOfLists = new ArrayList<List<Pair<ParseNode,ParseNode>>>();

listOfLists.add(new ArrayList<<Pair<ParseNode,ParseNode>>());
ArrayList ListofList=新建ArrayList();

ListofList.add(新的ArrayListinDect。关于这个事实的更多信息在这里:我很抱歉我开始回答这个问题。理解是好的,但当你不能清楚地解释它时,它毫无价值:)现在我发现这还不清楚。