参数化类型数组

我无法确定以下RHS预期的类型参数

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

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

具体的参数化类型的arrays固有地被破坏。 记住数组是协变的,数组类型检查是运行时操作。 在运行时,所有generics都已被类型擦除,因此arrays存储检查无法从>告知> >

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

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

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

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

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

是合法的。

但是对于generics来说并不相同。 即使T扩展X,也无法将Foo分配给Foo 。因此,无法保证Foo[]元素类型安全。

编辑请原谅我只是链接,但我找到了Java理论和实践:generics得到的文章,这解释了关于数组协方差的一切比我梦想的更好。

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

 ArrayList>> listOfLists = new ArrayList>>(); listOfLists.add(new ArrayList<>());