Java Generics:对一个通用超类进行子类化 - 是一个可再生类型的子类?

时间:2011-08-29 17:33:51

标签: java generics

我正在通过mughal(第3版)(我遇到的最好的SCJP书)和第727页阅读SCJP,它说的如下:

class MyIntList extends ArrayList <Integer> {} // A reifiable subclass  

现在我在这里有点困惑。我知道子类是非泛型类型,但因为它扩展了ArrayList&lt; Integer&gt;和参数化的&lt;整数&gt;最终将被删除,并且这个子类将继承它的超类的属性,为什么这个子类MyIntList是一个可再生的类型?

3 个答案:

答案 0 :(得分:3)

因为MyIntList的每个实例都是Array<Integer>,所以您可以使用反射找出下限/上限。

如果您说class MyNumberList<T extends Number> extends ArrayList<T> { ... },您仍然可以找到T的特定实例的界限,但不完全是MyNumberList

答案 1 :(得分:3)

Java语言规范 http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html

4.7可恢复类型

由于在编译期间会删除某些类型信息,因此并非所有类型在运行时都可用。在运行时完全可用的类型称为可重新类型。当且仅当下列之一成立时,类型才可以恢复:

  • 它指的是非泛型类型声明。
  • 这是一个参数化类型,其中所有类型参数都是无界通配符(§4.5.1)。
  • 这是一种原始类型(§4.8)。
  • 这是一种原始类型(§4.2)。
  • 它是一种数组类型(第10.1节),其组件类型是可以恢复的。

答案 2 :(得分:0)

在编译ArrayList期间删除泛型类型,但在编译MyIntList期间不会删除。因此,在运行时,您可以通过调用MyIntList.class.getGenericSuperclass()并分析返回的对象来找出MyIntList扩展ArrayList。

可能的原因是MyIntList本身不是通用的,而是扩展了ArrayList的具体实例。因此,这些信息可以存储在MyIntList的Class对象中(使用上述方法可以访问它)。