为什么在类级别不允许使用泛型中的超级关键字

emo*_*nas 10 java generics polymorphism inheritance

在泛型

class A<T extends Number> 被允许

class A<T super Integer> 不被允许

我没有明白这一点.这可能听起来像新手问题,但我陷入其中

And*_*ner 8

引用Java Generics:扩展,超级和通配符解释:

类定义中不允许超级绑定.

//this code does not compile !
class Forbidden<X super Vehicle> { }
Run Code Online (Sandbox Code Playgroud)

为什么?因为这种结构没有意义.例如,您无法使用Vehicle删除类型参数,因为可以使用Object实例化Forbidden类.因此,您必须将类型参数擦除到Object.如果考虑禁用类,它可以取代X的任何值,而不仅仅是超级类的Vehicle.使用超级绑定毫无意义,它不会给我们任何东西.因此不允许这样做.

  • 我知道我迟到对此发表评论.请清除我这个查询:"你无法抹去与车辆类型的参数,因为故宫的类可以使用对象实例化"是不是在"名单<超级号码?>"的情况下,这是真的吗?这也应该删除为Object,为什么允许这样做呢? (6认同)
  • @AnkushGatfane 它*被*擦除为`Object`。`&lt;T super Number&gt;` 和 `&lt;? super Number&gt;` 是你实际上不能做任何有用的事情,因为它是“那种类型”:你所知道的关于 `T` 是它拥有 `Object` 拥有的所有方法。但是 *all* 引用类型具有 `Object` 具有的所有方法,因此除了将 `Number` 的任何实例添加到该对象之外,您只知道使用了 `?` list 与列表中元素类型的期望兼容(即 `Number` 是所需类型的子类)。 (2认同)