我正在通过mughal(第3版)(我遇到的最好的SCJP书)和第727页阅读SCJP,它说的如下:
class MyIntList extends ArrayList <Integer> {} // A reifiable subclass
现在我在这里有点困惑。我知道子类是非泛型类型,但因为它扩展了ArrayList&lt; Integer&gt;和参数化的&lt;整数&gt;最终将被删除,并且这个子类将继承它的超类的属性,为什么这个子类MyIntList是一个可再生的类型?
答案 0 :(得分:3)
因为MyIntList
的每个实例都是Array<Integer>
,所以您可以使用反射找出下限/上限。
如果您说class MyNumberList<T extends Number> extends ArrayList<T> { ... }
,您仍然可以找到T
的特定实例的界限,但不完全是MyNumberList
。
答案 1 :(得分:3)
4.7可恢复类型
由于在编译期间会删除某些类型信息,因此并非所有类型在运行时都可用。在运行时完全可用的类型称为可重新类型。当且仅当下列之一成立时,类型才可以恢复:
答案 2 :(得分:0)
在编译ArrayList期间删除泛型类型,但在编译MyIntList期间不会删除。因此,在运行时,您可以通过调用MyIntList.class.getGenericSuperclass()
并分析返回的对象来找出MyIntList扩展ArrayList。
可能的原因是MyIntList本身不是通用的,而是扩展了ArrayList的具体实例。因此,这些信息可以存储在MyIntList的Class对象中(使用上述方法可以访问它)。