Beide nutzen als Restriktionsmechanismen und JavaDas Dokument sagt, dass der Platzhalter mit Obergrenze alle Unterklassen als Variablen zulässt, während gebundene Parameter nur deklarierte Klassenreferenzvariablen akzeptieren.
Meine Frage ist. Zum Beispiel, wenn wir nehmen Number
super class und deklariert sie als gebundene Typparameter. In der Regel werden alle Unterklassenvariablen im praktischen Szenario unabhängig vom Unterklassentyp akzeptiert. Warum also die Joker?
Antworten:
2 für die Antwort № 1Wie in der Dokumentation The term List<Number> is more restrictive than List<? extends Number> because the former matches a list of type Number only, whereas the latter matches a list of type Number or any of its subclasses.
Betrachten Sie dieses Beispiel
import java.util.Arrays;
import java.util.List;
public class Sample {
public static double sumOfList(List<? extends Number> list) {
double s = 0.0;
for (Number n : list)
s += n.doubleValue();
return s;
}
public static void main(String[] args) {
List<Double> ld = Arrays.asList(1.2, 2.3, 3.5);
System.out.println("sum = " + sumOfList(ld));
}
}
Oben funktioniert wie erwartet, wenn Sie diese Zeile jedoch ändern public static double sumOfList(List<Number> list) {
dann wird sich diese Zeile beschweren
System.out.println("sum = " + sumOfList(ld));
das ändern Sie es in Number, d. h. List<Number> ld
oder ändern
oder ändern Sie das Untermenü in public static double sumOfList(List<Double> list) {