我正在读莫卧儿的《南华早报》(第三版)(我读过的最好的南华早报的书),在第727页上,它写道:
class MyIntList extends ArrayList <Integer> {} // A reifiable subclass 现在我只是有点迷惑。我知道这个子类是一个非泛型类型,但是既然它扩展了ArrayList并且参数化最终会被擦除,并且这个子类将继承它的超类的属性,为什么这个子类MyIntList是一个可实现的类型呢?
发布于 2011-08-30 01:38:24
因为MyIntList的每个实例都是一个Array<Integer>,所以可以使用反射找出上下界。
如果您说的是class MyNumberList<T extends Number> extends ArrayList<T> { ... },您仍然可以找到界限,但是对于特定的MyNumberList实例来说,T并不完全一样。
发布于 2011-08-30 01:39:02
来自Java Language Specification http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html
4.7可实现的类型
由于某些类型信息在编译期间会被擦除,因此并非所有类型在运行时都可用。在运行时完全可用的类型称为可重构类型。当且仅当满足以下条件之一时,类型才是可重构的:
它是一个原始类型(§4.8)。
发布于 2011-08-30 01:48:38
泛型类型在编译ArrayList期间被擦除,但在MyIntList编译期间不会被擦除。因此,在运行时,您可以通过调用MyIntList.class.getGenericSuperclass()并分析返回的对象来发现MyIntList扩展了ArrayList。
之所以可以这样做,是因为MyIntList本身不是泛型的,而是扩展了ArrayList的具体实例。因此,这些信息只能存储在MyIntList的Class对象中(可以使用上面提到的方法从这个对象访问)。
https://stackoverflow.com/questions/7233634
复制相似问题