Warum beschwert sich Javac über Generika, die nichts mit den Typargumenten der Klasse zu tun haben? [Duplikat
Diese Frage hat hier bereits eine Antwort:
Java generische Methoden in generischen Klassen 6 answersWas ist ein roher Typ und warum sollten wir ihn nicht verwenden? 14 answers Bitte lies die Kommentare im Code in der richtigen Reihenfolge, die Details der Frage sind da.
Warum passiert dieser Unterschied?
Bitte geben Sie das JLS an, wenn möglich.
import java.util.*;
/**
* Suppose I have a generic class
* @param <T> with a type argument.
*/
class Generic<T> {
// Apart from using T normally,
T paramMethod() { return null; }
// the class' interface also contains Generic Java Collections
// which are not using T, but unrelated types.
List<Integer> unrelatedMethod() { return null; }
}
@SuppressWarnings("unused")
public class Test {
// If I use the class properly (with qualified type arguments)
void properUsage() {
Generic<String> g = new Generic<String>();
// everything works fine.
String s = g.paramMethod();
List<Integer> pos = g.unrelatedMethod();
// OK error: incompatible types: List<String> := List<Integer>
List<String> thisShouldErrorCompile = g.unrelatedMethod();
}
// But when I use the raw type, *ALL* the generics support is gone, even the Collections'.
void rawUsage() {
// Using Generic<?> as the type turns fixes the warnings below.
Generic g = new Generic();
// OK error: incompatible types: String := Object
String s = g.paramMethod();
// WTF warning: unchecked conversion: List<Integer> := raw List
List<Integer> pos = g.unrelatedMethod();
// WTF warning: unchecked conversion: List<String> := raw List
List<String> thisShouldErrorCompile = g.unrelatedMethod();
}
}
RandnotiIch habe dies ursprünglich in IntelliJ IDEA gefunden, aber ich vermute, dass der Compiler mit Javac kompatibel ist, da er beim Kompilieren des obigen Codes mit den folgenden Fehlern / Warnungen übereinstimmt.
$ javac -version
javac 1.7.0_05
$ javac Test.java -Xlint:unchecked
...
$ javac Test.java -Xlint:unchecked -source 1.5 -target 1.5
...