2012-10-03 7 views
8

Ich habe eine Verwirrung zwei Verfahren Erklärungen in folgenden:Sind <U, T nicht U> und <T, U Super T> gleich?

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  
    } 

Sollte nicht beide der oben genannten gültig? Mit der Analogie von Wenn U Eltern von T ist, dann ist T Kind von U. Warum gibt der zweite einen Kompilierungsfehler?

EDITIEREN :: Ich denke, T extends T und T super T beide sind gültig. Recht ?

+0

Ich vermute "T extends U" bedeutet 'T> = U 'wo' U super T 'bedeutet' U EJP

+0

Sie sollten sich [dieses thread] ansehen (http://stackoverflow.com/questions/ 1368166/Was ist ein Unterschied zwischen Super-e-und-Extends-e) – DayS

+0

@DayS: Thats? - irgendetwas. Ich verstehe das. Aber was ist mit T und U? –

Antwort

7
  • Typ-Parameter (Ihr Beispiel) nur erweitert Verwendung (JLS #4.4):
TypeParameter: 
    TypeVariable TypeBoundopt 

TypeBound: 
    extends TypeVariable 
    extends ClassOrInterfaceType AdditionalBoundListopt 

AdditionalBoundList: 
    AdditionalBound AdditionalBoundList 
    AdditionalBound 

AdditionalBound: 
    & InterfaceType 
  • Wildcards können entweder extends oder super (JLS #4.5.1):
TypeArguments: 
    <TypeArgumentList> 

TypeArgumentList: 
    TypeArgument 
    TypeArgumentList , TypeArgument 

TypeArgument: 
    ReferenceType 
    Wildcard 

Wildcard: 
    ? WildcardBoundsopt 

WildcardBounds: 
    extends ReferenceType 
    super ReferenceType 
2

Sie können ein benanntes Generikum nicht mit super verknüpfen. Siehe auch this Stapelüberlaufbuchung.

Verwandte Themen