Wenn Sie eine Instanz einer generischen Klasse als Ausgangstyp in Java deklariert, wird der Compiler eine parametrisierte Art von Object
für alle Teilnehmer, Methoden übernehmen? Gilt dies sogar für solche Verfahren, die eine Form (z. B. Collection
) eines konkret parametrisierten Typs zurückgeben?Java - Verhalten der Klassenmitglieder von generischer Klasse
erklärte ich fälschlicherweise eine Instanz einer generischen Klasse ohne parametrisierte Typ, der zu sehr interessanten nachgelagerten Effekte führten. Ich habe ein vereinfachtes Beispiel für ein Szenario angegeben, das einen Kompilierungsfehler "inkompatibler Typen" verursachte. Meine grundsätzliche Frage: Warum produziert javac einen 'inkompatible types' Fehler und beschwert sich über die unten angegebene Zeile?
import java.util.*;
public class Main {
public static void main(String[] args) {
final Test<String> t1 = new Test<String>();
final Test t2 = new Test<String>();
for (final Integer i : t1.getInts()) {
System.out.println(i);
}
for (final Integer i : t2.getInts()) { //<-- compile-time error
System.out.println(i);
}
}
public static class Test<T> {
public Test() {
}
public Set<Integer> getInts() {
final Set<Integer> outSet = new HashSet<Integer>();
outSet.add(new Integer(1));
outSet.add(new Integer(2));
outSet.add(new Integer(3));
return outSet;
}
}
}
Eine interessante Anmerkung ist, dass, wenn t2
mit einem Platzhalter-Typ deklariert wird (Test<?> t2…
) der Code kompiliert und läuft wie erwartet.
Die Verwendung der for-Schleife aufruft next()
jeder auf der Iterator auf dem Satz von getInts()
zurückgegeben (die einen generischen Typ kehrt aus dem gewonnenen Iterable iteriert wird). The documentation here erwähnt, dass, wenn das Iterable rohe ist, Object
als Rückgabetyp verwendet wird. Warum scheint der Compiler auch den Rückgabetyp von Test.getInts()
Set<Integer>
-Set<Object>
zu ändern?