8

次の 2 つのメソッド宣言に混乱があります。

    private <U, T extends U> T funWorks(T child, U parent) {
      // No compilation errors
    }

    private <T, U super T> T funNotWorks(T child, U parent) {
      // compilation errors    
    }

上記の両方が有効であるべきではありませんか?U が T の親である 場合、T は U の子です。では、なぜ2番目にコンパイルエラーが発生するのですか?

編集:: 私は、両方とも有効だと思いT extends TますT super T。右 ?

4

2 に答える 2

7
  • 型パラメーター (例) は extends ( JLS #4.4 )のみを使用できます。
TypeParameter:
    TypeVariable TypeBoundopt

TypeBound:
    extends TypeVariable
    extends ClassOrInterfaceType AdditionalBoundListopt

AdditionalBoundList:
    AdditionalBound AdditionalBoundList
    AdditionalBound

AdditionalBound:
    & InterfaceType
  • ワイルドカードは、extendsまたはsuper( JLS #4.5.1 )のいずれかを使用できます。
TypeArguments:
    < TypeArgumentList >

TypeArgumentList: 
    TypeArgument
    TypeArgumentList , TypeArgument

TypeArgument:
    ReferenceType
    Wildcard

Wildcard:
    ? WildcardBoundsopt

WildcardBounds:
    extends ReferenceType
    super ReferenceType
于 2012-10-03T09:46:23.867 に答える
2

名前付きジェネリックをスーパーでバインドすることはできません。このスタックオーバーフローの投稿も参照してください。

于 2012-10-03T09:45:33.677 に答える