通用类实例的三个声明之间的区别

时间:2015-07-02 17:00:50

标签: java arrays generics

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声明工作正常,但第二声明没有。

这三者有什么区别?

1 个答案:

答案 0 :(得分:2)

第二行和第三行是创建通用数组的示例。第二个不是可恢复的。这意味着该类型在运行时不可用。

JLS, Section 15.10,涵盖数组创建:

  

如果ClassOrInterfaceType不表示可重新类型(第4.7节),则为编译时错误。

Section 4.7定义了一个可重复的类型:

  

当且仅当下列之一成立时,类型才可以恢复:

     
      
  • 它指的是非泛型类或接口类型声明。

  •   
  • 这是一个参数化类型,其中所有类型参数都是无界通配符(§4.5.1)。

  •   
  • 这是一种原始类型(§4.8)。

  •   
  • 这是一种原始类型(§4.2)。

  •   
  • 这是一个数组类型(第10.1节),其元素类型是可以恢复的。

  •   
  • 这是一种嵌套类型,对于每个以“。”分隔的T类型,T本身都是可以恢复的。

  •   

所以,第二行是不允许的,因为它是一种不可再生的类型的数组类型,因为它是通用的,并不是所有无界的通配符。第三行是好的,只因为它的泛型是无限的通配符。

第一行是好的,因为它不是数组。