2012-10-03 21 views
8

Mam zamieszanie w następujących deklaracji dwa metoda:Czy <U, T przedłuża U> i <T, U super T> nie są takie same?

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  
    } 

nie powinno oba powyższe być ważne? Z analogią Jeśli U jest rodzicem T, to T jest potomkiem U. Dlaczego drugi daje błąd kompilacji?

EDYTOWANIE :: Sądzę, że T extends T i T super T oba są ważne. dobrze ?

+0

Podejrzewam, że 'T przedłuża U' oznacza 'T> = U' gdzie' U super T' oznacza 'U EJP

+0

Powinieneś rzucić okiem na [ten wątek] (http://stackoverflow.com/questions/ 1368166/co-jest-różnica między super-e-a-extends-e) – DayS

+0

@DayS: To jest? - byle co. Rozumiem, że. Ale co w przypadku T i U? –

Odpowiedz

7
  • parametry typu (Twój przykład) może korzystać tylko rozszerza (JLS #4.4):
TypeParameter: 
    TypeVariable TypeBoundopt 

TypeBound: 
    extends TypeVariable 
    extends ClassOrInterfaceType AdditionalBoundListopt 

AdditionalBoundList: 
    AdditionalBound AdditionalBoundList 
    AdditionalBound 

AdditionalBound: 
    & InterfaceType 
  • Symbole wieloznaczne mogą korzystać zarówno extends lub super (JLS #4.5.1):
TypeArguments: 
    <TypeArgumentList> 

TypeArgumentList: 
    TypeArgument 
    TypeArgumentList , TypeArgument 

TypeArgument: 
    ReferenceType 
    Wildcard 

Wildcard: 
    ? WildcardBoundsopt 

WildcardBounds: 
    extends ReferenceType 
    super ReferenceType 
2

Nie można powiązać nazwanego generika z super. Zobacz także publikację this stackoverflow.

Powiązane problemy