2016-11-09 2 views
1
<T extends Number> void m1(List<T> list) { 
    list.add(list.get(0)); 
} 

void m2(List<? extends Number> list) { 
    list.add(list.get(0)); 
} 

Ich fand schwierig, den Unterschied zwischen den beiden oben genannten Methoden zu verstehen.
Erste Methode m1() erfolgreich kompiliert, aber Methode m2() erzeugt einen Compiler-Fehler:Java Wildcard Capture

The method add(capture#1-of ? extends Number) in the type List<capture#1-of ? extends Number> is not applicable for the arguments (capture#2-of ? extends Number)

+1

TypeErasure .... –

Antwort

2

Da Sie eine Iten auf einer Liste von Typ mit oberen Schranken hinzufügen können nicht! Sie könnten eine Liste oder Liste haben, in der die anderen nicht für Änderungsoperationen passen!

List<? extends Number> list = new ArrayList<Integer>(); 
List<? extends Number> list = new ArrayList<Double>(); 
List<? extends Number> list = new ArrayList<Long>(); 

In diesem Fall könnte die Variablenliste einen beliebigen Typ in der Instanz haben, der Number erweitert. So können Sie es zum Beispiel in Ihrer Methode weitergeben. Aber da könntest du jetzt nicht wirklich was Typ sein könnte. Du könntest eine ArrayList haben und dazu sagen, dass du ein neues Double hinzufügst. In der Kompilierzeit macht das Sinn, denn Double erweitert Number, aber in Runtime könnte die Liste nicht von diesem Typ sein und eine Exception werfen.

Denken Sie daran, dass, wenn Sie die oberen Grenzen verwenden, <? extends T> Sie kippe die Liste ändern, lesen Sie es einfach! Es ist die Oracle tutorial (siehe Wildcards Kapitel Inhalt - Ober Bounded Wildcards, Lower Bounded Wildcards etc.)