2012-10-03 85 views
8

que tienen una confusión en el seguimiento de las declaraciones de dos métodos:¿No son <U, T se extiende U> y <T, U super T> lo mismo?

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  
    } 

En caso de que no tanto de lo anterior sea válida? Con la analogía de Si U es padre de T, entonces T es hijo de U. Entonces, ¿por qué el segundo da error de compilación?

EDIT :: Creo que T extends T y T super T son válidos. derecho ?

+0

Sospecho que 'T extiende U' significa 'T> = U' donde' U super T' significa 'U EJP

+0

Deberías echar un vistazo a [este hilo] (http://stackoverflow.com/questions/ 1368166/what-is-a-difference-between-super-e-and-extends-e) – DayS

+0

@DayS: ¿Eso es todo? - cualquier cosa. Entiendo que. ¿Pero qué pasa en el caso de T y U? –

Respuesta

7
  • parámetros de tipo (el ejemplo) sólo pueden utilizar extiende (JLS #4.4):
TypeParameter: 
    TypeVariable TypeBoundopt 

TypeBound: 
    extends TypeVariable 
    extends ClassOrInterfaceType AdditionalBoundListopt 

AdditionalBoundList: 
    AdditionalBound AdditionalBoundList 
    AdditionalBound 

AdditionalBound: 
    & InterfaceType 
  • comodines puede utilizar cualquiera extends o super (JLS #4.5.1):
TypeArguments: 
    <TypeArgumentList> 

TypeArgumentList: 
    TypeArgument 
    TypeArgumentList , TypeArgument 

TypeArgument: 
    ReferenceType 
    Wildcard 

Wildcard: 
    ? WildcardBoundsopt 

WildcardBounds: 
    extends ReferenceType 
    super ReferenceType 
2

No puede enlazar un nombre genérico con super. Consulte también this publicación de stackoverflow.

Cuestiones relacionadas