首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java泛型:泛型超类的子类化-子类是可实现的类型吗?

Java泛型:泛型超类的子类化-子类是可实现的类型吗?
EN

Stack Overflow用户
提问于 2011-08-30 01:33:51
回答 3查看 2.4K关注 0票数 3

我正在读莫卧儿的《南华早报》(第三版)(我读过的最好的南华早报的书),在第727页上,它写道:

代码语言:javascript
复制
class MyIntList extends ArrayList <Integer> {} // A reifiable subclass  

现在我只是有点迷惑。我知道这个子类是一个非泛型类型,但是既然它扩展了ArrayList并且参数化最终会被擦除,并且这个子类将继承它的超类的属性,为什么这个子类MyIntList是一个可实现的类型呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-30 01:38:24

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

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

票数 3
EN

Stack Overflow用户

发布于 2011-08-30 01:39:02

来自Java Language Specification http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html

4.7可实现的类型

由于某些类型信息在编译期间会被擦除,因此并非所有类型在运行时都可用。在运行时完全可用的类型称为可重构类型。当且仅当满足以下条件之一时,类型才是可重构的:

  • 它指的是非泛型类型declaration.
  • It是一个参数化类型,其中所有类型参数都是无界的通配符(§4.5.1)。

它是一个原始类型(§4.8)。

  • 它是一个基元类型(§4.2)。
  • 它是一个数组类型(§10.1),其组件类型是可重新定义的。
票数 3
EN

Stack Overflow用户

发布于 2011-08-30 01:48:38

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

之所以可以这样做,是因为MyIntList本身不是泛型的,而是扩展了ArrayList的具体实例。因此,这些信息只能存储在MyIntList的Class对象中(可以使用上面提到的方法从这个对象访问)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7233634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档