Gen <Integer> iOb = new Gen <> (50, n); //Works good
Gen <Integer> gens[] = new Gen <> [10]; //Error
Gen <?> gen[] = new Gen <?> [10]; //Alternative way for the second form
我想知道为什么第1和第3声明工作正常,但第二声明没有。
这三者有什么区别?
答案 0 :(得分:2)
第二行和第三行是创建通用数组的示例。第二个不是可恢复的。这意味着该类型在运行时不可用。
JLS, Section 15.10,涵盖数组创建:
如果ClassOrInterfaceType不表示可重新类型(第4.7节),则为编译时错误。
Section 4.7定义了一个可重复的类型:
当且仅当下列之一成立时,类型才可以恢复:
它指的是非泛型类或接口类型声明。
这是一个参数化类型,其中所有类型参数都是无界通配符(§4.5.1)。
这是一种原始类型(§4.8)。
这是一种原始类型(§4.2)。
这是一个数组类型(第10.1节),其元素类型是可以恢复的。
这是一种嵌套类型,对于每个以“。”分隔的T类型,T本身都是可以恢复的。
所以,第二行是不允许的,因为它是一种不可再生的类型的数组类型,因为它是通用的,并不是所有无界的通配符。第三行是好的,只因为它的泛型是无限的通配符。
第一行是好的,因为它不是数组。