参数化类型数组

我无法弄清楚以下RHS的预期类型参数

ArrayList<Pair<ParseNode,ParseNode>>[] nodes = new ArrayList[indexes.length];

为什么<Pair<ParseNode,ParseNode>>的副本不合法?


混凝土参数化类型的阵列固有地被打破。 记住数组是协变的,数组类型检查是一个运行时操作。 在运行时,所有泛型都被擦除,因此Array Store检查不能从<Pair<BigInteger,IOException>>告诉<Pair<ParseNode, ParseNode>> <Pair<BigInteger,IOException>>

泛型的基本契约是“我,编译器,承诺如果你编写的代码不会产生警告,那么在运行时永远不会得到类转换异常。”

如果某些不是ArrayList<Pair<ParseNode,ParseNode>>的东西放入该数组中,编译器也不会向您保证编译时会出错。 运行时系统如果添加了错误的类型,也不能保证你会得到一个ArrayStoreException(就像Language Specification所说的那样),而不是在稍后将它返回时抛出ClassCastException。 (第二部分实际上是为什么它实际上是非法的,而不仅仅是一个警告,它会导致一个不遵守语言规范的数组。)

所以它不会让你以这种方式宣布它们,并迫使你承认“不安全”的警告。 这样,它说:“我告诉过你,我不能保证不会因为使用这个数组而导致任何类抛出异常,这是为了确保你只在这里放置正确的东西。”


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

A[] a = new A[10];
B[] b = a;

是合法的。

但泛型不同。 即使T扩展X,也不能将Foo<T>赋值给Foo<X> 。因此Foo<T>[]元素不能保证类型安全。

编辑对不起,我只是连接出来,但我发现Java理论和实践:泛型陷入文章,这解释了一切有关阵列协方差比我甚至会梦想。


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

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

listOfLists.add(new ArrayList<<Pair<ParseNode,ParseNode>>());
链接地址: http://www.djcxy.com/p/46091.html

上一篇: array of parameterized types

下一篇: Left padding a String with Zeros