Warum fallen Sammlungen, die nicht mit der Vorlagenklasse zusammenhängen, ihren Typ? Hier ein Beispiel: (Sorry, es wird nicht kompiliert, da der Fehler über Ich bin verwirrt.)Generische Verschraubungen nicht zusammenhängender Sammlungen
package test;
import java.util.ArrayList;
import java.util.List;
public class TemplateTest {
public static class A { }
public static class B<T extends Comparable> {
List<A> aList = new ArrayList<A>();
public List<A> getAList() {
return aList;
}
public int compare(T t, T t1) {
return t.compareTo(t1);
}
}
public static void main(String[] args) {
B b = new B();
for (A a : b.getAList()) { //THIS DOES NOT WORK
}
List<A> aList = b.getAList(); //THIS WORKS
for (A a : aList) {
}
}
}
Dieser Code wirft einen Fehler bei der Zusammenstellung:
test/TemplateTest.java:24: incompatible types
found : java.lang.Object
required: test.TemplateTest.A
for (A a : b.getAList()) {
Wenn ich die Vorlage angeben von B
wie B<String>
, oder wenn ich die Vorlage komplett aus B entferne, dann ist alles in Ordnung.
Was ist los?
EDIT: Leute darauf hingewiesen, gibt es keine Notwendigkeit ich generic B so zugesetzt, um war
Traurig über den Unsinn vor ... Das scheint mit einem Fehler verbunden sein. Kudos! –
Nicht strikt auf Ihre Frage bezogen, aber * nicht * das Angeben des Typparameters in Java wird im Allgemeinen als Programmierfehler betrachtet. Die Verwendung des Rohtyps kompiliert nur als Zugeständnis an Rückwärtskompatibilität. – Affe
Ich rufe Compiler-Fehler auch. Es scheint, als ob der Typ des Ausdrucks auf der rechten Seite, der in einer erweiterten for-Schleife verwendet wird, auf eine spezielle Art und Weise bestimmt wird (nicht überraschend, da er Spezialfälle benötigt), und das bricht, wenn ein roher Typ beteiligt ist. (Ich sehe einen rohen Typ irgendwo, er nimmt an, dass der ganze Ausdruck Typen gelöscht hat.) – millimoose