2013-07-24 10 views
5

Sto cercando di leggere e capire un po 'di codice Java. Eccolo:Uso di "super" con "?" in Java

protected LoadTarget<? super PopulationLoadContext> createTarget(PopulationLoadContext context) { 
    return createTransactionalTargetGroup(RiskScoresTables.All_Tables); 
} 

Che cosa significa "<? super PopulationLoadContext>"?

+3

http://docs.oracle.com/javase/tutorial/java/generics/subtyping.html –

+1

Vedere http://stackoverflow.com/questions/3847162/java-generics-super-keyword –

+1

+1: per mi sta imparando qualcosa di nuovo :) –

risposta

8

In Java, ovvero lower-bounded wildcard in generics, che corrisponde a PopulationLoadContext oa qualsiasi superclasse di tale classe.

Potrebbe essere un LoadTarget<PopulationLoadContext>, oppure potrebbe essere un LoadTarget<Object> o qualsiasi altra via di mezzo (se tra le classi esiste).

+0

@RichardW Una risorsa eccellente - che ho già collegato. – rgettman

1

Che cos'è?

Come indicato da rgettman è un tipo generico LoadTarget con un argomento di tipo impostato su un carattere jolly con limite inferiore.

Cosa consente?

A runtime una variabile LoadTarget può essere sostituito (set) con un valore dello stesso tipo in cui l'argomento tipo è PopulationLoadContext o un antenato.

Perché?

Per consentire la flessibilità, una famiglia di tipi diversi di istanze può essere sostituita a vicenda e funzionare correttamente. All'interno di LoadTarget, il parametro type viene utilizzato per i parametri del metodo (input) o per i limiti di tipo superiore dei tipi generici internamente istanziati. In questi casi, un tipo più ampio è sostituibile al tipo originale perché è più accomodante. Il tipo generico si dice che abbia controvarianza con il suo parametro di tipo

1

Più in generale (non solo Java parlando), se si desidera ottenere un quadro più ampio, è anche chiamato covarianza/controvarianza: http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29 vedere la sezione Java:

"dato un List<? extends Foo>, poi un elemento può essere recuperata e sicuro assegnato a un Foo tipo (covarianza). Dato un List<? super Foo>, quindi un oggetto Foo può essere tranquillamente aggiunto come elemento (controvarianza)."