1

为什么会导致编译错误:

public <S super T> void addImplements(Class<S> cl)

而这没关系:

public <S extends T> void addImplementedBy(Class<S> cl)

T是在类上指定的类型参数。第一个错误消息是Syntax error on token "super", , expected

更新

这显然没问题:

public void addImplements(Class<? super T> cl)

这本质上是相同的,但没有命名的 type S

为什么不允许或支持第一个变体?从技术上看来,完全有可能支持它。那么它是设计无效还是不支持(尚)?

我没有从链接的重复答案中得到“不给你买任何东西”。一方面,它给我买了一个S我可以使用的命名类型。第二个变体 ( ? super T) 不提供。

注意Java7 和 Java8 相同

4

1 回答 1

2

Java SE 8的Java 语言规范定义了一个Type 参数

TypeParameter:
{TypeParameterModifier} Identifier [TypeBound]

和一个类型绑定

TypeBound:
extends TypeVariable
extends ClassOrInterfaceType {AdditionalBound}

所以关键字super是明确不允许的。原因由 Angelika Langer 关于 Java 泛型的常见问题解答

类型参数可以有多个上限,但没有下限。这主要是因为类的下限类型参数会令人困惑并且不是特别有用。

于 2015-10-11T20:31:42.690 回答