为什么会导致编译错误:
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)
本质上是相同的,但没有命名类型S
。
为什么不允许或不支持第一个变体?从技术上看,支持它是完全可能的。所以它是设计无效的还是只是不支持?
我没有从链接的重复答案中得到"不买你任何东西"。首先,它为我买了一个我可以使用的命名类型S
。第二个变体(? super T
)不提供这个功能。
注意在Java7和Java8中相同
Java SE 8的Java语言规范定义了一个Type参数:
TypeParameter:
{TypeParameterModifier} Identifier [TypeBound]
和绑定:
的类型TypeBound:
extends TypeVariable
extends ClassOrInterfaceType {AdditionalBound}
所以关键字super
是明确不允许的。Angelika Langer关于Java泛型的FAQ给出了原因:
类型参数可以有几个上界,但没有下界。这主要是因为类的下界类型参数会令人困惑,而且没有特别的帮助。