Platzhalter in Generics sind für Collection Type und in der Regel nicht für Elemente gespeichert.
Stellen Sie sich zum Beispiel eine Methode vor, die Argument List<Number>
übernimmt.
public void calculateSum(List<Number> numbers) {
for (Number n: numbers) {
// calculate Sum
}
}
Nun, wenn wir wollen, indem List<Integer>
Summe ganzer Zahlen wie folgt berechnen.(Beachten Sie, dass Integer
ist eine Unterklasse von Number
)
List<Integer> integers= new ArrayList<Integer>();
//Populate collection
calculateSum(integers); //Error
Dies wird nicht als selbst arbeiten, obwohl Integers
ist ein Subtyp von Number
List<Integers>
ist kein subType von List<Number>
. Beachten Sie, dass List<Number>
noch speichern kann Integer
, Float
, Double
usw.
Also, um eine generische Methode, um die Summe von jeder Art von Number
wir Wildcard berechnen verwenden als
public void calculateSum(List<? extends Number> numbers) {
for (Number n: numbers) {
// calculate Sum
}
}
folgt Dies wird die Berechnung der Summe von jeder Art von Zahlen zur Verfügung gestellt, dass der Typ erweitert Number
Lesen Sie diese. Genau das, was Sie wissen wollen. Http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html –
"Der Begriff List ist restriktiver als List Extends Number>, weil ersteres einer Liste entspricht nur vom Typ Number, wobei letzteres mit einer Liste vom Typ Number oder einer seiner Unterklassen übereinstimmt. " Von der Ressource, SURESH oben verlinkt. –
Fildor
Sie können sich das ansehen. http://www.thejavadeek.com/2013/08/28/generics-the-wildcard-operator/ –