参数化类型数组

我在弄清楚以下RHS中期望使用什么类型参数时遇到问题

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

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

回答:

具体参数化类型的数组固有地被破坏。请记住,数组是协变的,数组类型检查是运行时操作。在运行时,所有泛型都已被擦除,因此Array

Store检查无法<Pair<ParseNode, ParseNode>>从中分辨出来<Pair<BigInteger,IOException>>

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

编译器也不能向您保证,如果ArrayList<Pair<ParseNode,ParseNode>>在数组中放置了非的内容,它将能够给您带来编译时错误。如果添加错误的类型,运行时系统也无法保证会得到ArrayStoreException(如Language

Specification所述),而不是稍后将其取回时抛出ClassCastException。(第二部分实际上就是为什么它实际上是非法的,而不仅仅是警告,它会导致数组不遵守语言规范。)

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

以上是 参数化类型数组 的全部内容, 来源链接: utcz.com/qa/414231.html

回到顶部