我正在深入研究Java泛型,并尝试一些边缘案例来测试我的理解。 比较这些类声明:
class C<T extends Number> { // this works
class C<T super Number> { // this doesn't
为什么我不能用<T super Number>
声明泛型类?
答案 0 :(得分:1)
你不能在类声明中使用“super”
为什么呢?因为这种结构没有意义。例如,您无法使用Vehicle删除类型参数,因为可以使用Object实例化Forbidden类。因此,您必须将类型参数擦除到Object。如果考虑禁用类,它可以取代X的任何值,而不仅仅是超级类的Vehicle。使用超级绑定毫无意义,它不会给我们任何东西。因此不允许这样做。
答案 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关键字用于任何基类型 - 无论基类型是否为 一个类或一个接口。