方法类型参数出现意外语法错误



为什么会导致编译错误:

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给出了原因:

类型参数可以有几个上界,但没有下界。这主要是因为类的下界类型参数会令人困惑,而且没有特别的帮助。

相关内容

  • 没有找到相关文章

最新更新