为什么我不能将泛型类声明为:class C <t super =“”number =“”> </t>

时间:2014-01-29 15:11:32

标签: java generics

我正在深入研究Java泛型,并尝试一些边缘案例来测试我的理解。 比较这些类声明:

class C<T extends Number> { // this works

class C<T super Number> { // this doesn't

为什么我不能用<T super Number>声明泛型类?

3 个答案:

答案 0 :(得分:1)

你不能在类声明中使用“super”

  

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

请参阅http://onewebsql.com/blog/generics-extends-super

答案 1 :(得分:0)

类标识符旁边的<...>部分是类型参数列表。在其中,您声明了类型变量。 Java语言规范具有关于类型变量的具体规则。这些被描述为here。报价

TypeParameter:
    TypeVariable TypeBoundopt

TypeBound:
    extends TypeVariable
    extends ClassOrInterfaceType AdditionalBoundListopt

AdditionalBoundList:
    AdditionalBound AdditionalBoundList
    AdditionalBound

AdditionalBound:
    & InterfaceType

换句话说,您不能在类型参数中使用super关键字。

答案 2 :(得分:0)

关键字extends用于指定类型T的上限;有了这个,只有 实现接口Number的类或接口可以用作T的替代。 请注意,extends关键字用于任何基类型 - 无论基类型是否为 一个类或一个接口。