2013-07-24 9 views
5

Ich versuche, Java-Code zu lesen und zu verstehen. Hier ist sie:Verwendung von "Super" mit "?" in Java

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

Was bedeutet die <? super PopulationLoadContext> bedeuten?

+3

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

+1

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

+1

+1: für lerne mich etwas Neues :) –

Antwort

8

In Java ist das eine lower-bounded wildcard in generics, die für PopulationLoadContext oder jede Oberklasse dieser Klasse steht.

Es könnte ein LoadTarget<PopulationLoadContext>, oder es könnte ein LoadTarget<Object>, oder irgendetwas dazwischen sein (wenn zwischen Klassen vorhanden sind).

+0

@RichardW Eine ausgezeichnete Ressource - die ich bereits verlinkt habe. – rgettman

1

Was ist das?

Wie rgettman angegeben, es ist ein generischer Typ LoadTarget mit einem Typ Argumente eines unteren begrenzt Wildcard gesetzt.

Was erlaubt es?

Zur Laufzeit kann eine LoadTarget Variable mit einem Wert des gleichen Typs substituiert (gesetzt) ​​werden, wobei das Argument type PopulationLoadContext oder ein Vorgänger ist.

Warum?

Um Flexibilität zu ermöglichen - eine Familie von verschiedenen instanziierten Typen kann sich gegenseitig ersetzen und gut funktionieren. Innerhalb von LoadTarget wird der type-Parameter für Methodenparameter (Eingabe) oder für obere Typgrenzen von intern instantiierten generischen Typen verwendet. In diesen Fällen ist ein breiterer Typ für den ursprünglichen Typ ersetzbar, weil er passender ist. Der generische Typ wird gesagt, Kontra haben, mit seiner Art Parameter

1

Allgemeiner (nicht nur Java sprechend), wenn Sie ein größeres Bild erhalten möchten, ist es auch Kovarianz/Kontra genannt: http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29 Java siehe Abschnitt:

"a List<? extends Foo> gegeben, dann kann ein Element wiedergewonnen werden und sicher zu einem Foo Typ zugeordnet (Kovarianz). kann als Element (Kontra) sicher ein List<? super Foo>, dann ein Foo Objekt gegeben werden, hinzugefügt."