2015-12-23 4 views
6

Ich lese gerade Java Generics, und ich bin ein bisschen fest, wenn es um Wildcards geht.Java Generics - Class eine Unterklasse von sich selbst?

ich diese Methode aus der Klasse Collections gegeben wurde:

public void <T> copy(List<? super T> dest, List<? extends T> src) { 
    for(int i = 0; i < src.size(); i++) { 
     dest.set(i, src.get(i)); 
    } 
} 

Ich habe dann gesagt, dass es möglich ist, das Verfahren so zu nennen:

List<Object> objs = new ArrayList<Object>(); 
List<Integer> ints = new ArrayList<Integer>(); 
Collections.copy(objs, ints); 

Da die Typ-Parameter haben dem Compiler überlassen wurde, um zu bestimmen, sagt das Buch, dass der Compiler den Typparameter zu Integer wählt.

Aber wie ist das möglich?

Wenn es genommen wurde Integer zu sein, würde dies, dass in der Methodendeklaration bedeuten -
List<? extends T>-List<Integer extends Integer> übersetzen würde.

Ist das ein Fehler oder gibt es andere Regeln in Bezug auf Generics? Ich habe gegoogelt und die Mehrheit der Ergebnisse sagen, dass eine Klasse keine Unterklasse von sich selbst sein kann.

+0

Nizets Antwort ist natürlich richtig und wenn du nur den Punkt vermisstest, den er erklärt hat, dann ist alles gut. Generika können jedoch sehr schnell sehr verwirrend werden, und wenn Sie das Gefühl haben, dass Sie eine ausführlichere Erklärung zu diesem speziellen Fall benötigen, kann ich versuchen, eine solche zu geben. – user1803551

Antwort

8

Nein, es ist kein Fehler.

? extends Integer bedeutet: jede Klasse, die Integer ist oder erweitert (oder implementiert Integer, wenn Integer eine Schnittstelle war).

Das gleiche gilt für ? super Integer, was bedeutet: jede Klasse, die Integer ist oder ist eine Superklasse oder Super-Schnittstelle von Integer.

+0

Vielen Dank für das Aufräumen. Wird die Antwort akzeptieren, wenn die Option verfügbar ist. – user3650602