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

最初のバリアントが許可またはサポートされていないのはなぜですか? 技術的には、それをサポートすることは完全に可能であるように思われます。設計上無効なのか、それとも (まだ) サポートされていないのか?

リンクされた重複した回答から「何も買わない」というメッセージが表示されません。1 つは、使用できる名前付きの型を購入するSことです。2 番目のバリアント ( ? super T) はそれを提供しません。

Java7 と Java8 で同じことに注意してください

4

1 に答える 1

2

Java SE 8のJava 言語仕様では、 Type パラメータを次のように定義しています。

TypeParameter:
{TypeParameterModifier} Identifier [TypeBound]

およびタイプ バウンド:

TypeBound:
extends TypeVariable
extends ClassOrInterfaceType {AdditionalBound}

したがって、キーワードsuperは明示的に許可されていません。その理由は 、 Java Generics の Angelika Langer FAQ に記載されています。

型パラメータにはいくつかの上限がありますが、下限はありません。これは主に、クラスの下限型パラメーターが混乱を招き、特に役に立たないためです。

于 2015-10-11T20:31:42.690 に答える