2012-10-03 10 views
8

私は2つのメソッドの宣言は次の混乱を持っている:<U、T extends U>と<T、U super T>は同じですか?

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 TT super Tの両方が有効だと思います。右 ?

+0

私は 'T extends U' 'T> = U'を意味し、' U super T'は 'U EJP

+0

[this thread](http://stackoverflow.com/questions/) 1368166/e-and-a-e-between-a-difference-e) – DayS

+0

@DayS:Thats about? - 何でも。という事は承知しています。しかし、TとUの場合には何がありますか? –

答えて

7
  • 型パラメータ(あなたの例)のみで使用することは、(JLS #4.4)を拡張することができます:
TypeParameter: 
    TypeVariable TypeBoundopt 

TypeBound: 
    extends TypeVariable 
    extends ClassOrInterfaceType AdditionalBoundListopt 

AdditionalBoundList: 
    AdditionalBound AdditionalBoundList 
    AdditionalBound 

AdditionalBound: 
    & InterfaceType 
  • ワイルドカードはextendsまたはsuperJLS #4.5.1)のいずれかを使用することができます:
TypeArguments: 
    <TypeArgumentList> 

TypeArgumentList: 
    TypeArgument 
    TypeArgumentList , TypeArgument 

TypeArgument: 
    ReferenceType 
    Wildcard 

Wildcard: 
    ? WildcardBoundsopt 

WildcardBounds: 
    extends ReferenceType 
    super ReferenceType 
2

スーパーで名前付きジェネリックをバインドすることはできません。 this stackoverflow掲載を参照してください。

関連する問題