Der folgende Code
public class GenericsTest2 {
public static void main(String[] args) throws Exception {
Integer i = readObject(args[0]);
System.out.println(i);
}
public static <T> T readObject(String file) throws Exception {
return readObject(new ObjectInputStream(new FileInputStream(file)));
// closing the stream in finally removed to get a small example
}
@SuppressWarnings("unchecked")
public static <T> T readObject(ObjectInputStream stream) throws Exception {
return (T)stream.readObject();
}
}
Kompiliert in Eclipse, jedoch nicht mit Javac (Typparameter von T können nicht bestimmt werden; für die Typvariable T mit den oberen Grenzen T, java.lang.Object, existiert keine eindeutige maximale Instanz).
Wenn ich readObject (String file) in ändere
@SuppressWarnings("unchecked")
public static <T> T readObject(String file) throws Exception {
return (T)readObject(new ObjectInputStream(new FileInputStream(file)));
}
es kompiliert in Eclipse und mit Javac. Wer ist richtig, der Eclipse-Compiler oder Javac?
Oracle JDK6 u22 sollte korrekt sein, aber ich habe dieses Problem auch mit JDK6 u24
Dies ist ein Fehler des Eclipse- Fehlers 98379 .
Dies wurde nicht behoben, aber das Problem wird durch eine Problemumgehung wie in Eclipse-Fehlern behoben (siehe Link).
quelle
Ich habe dieses Problem in der Java-Version "1.6.0_22" gefunden. Es verschwand, als ich auf die Java-Version "1.6.0_32" aktualisierte, da dies in Update 25 behoben wurde.
quelle
Wenn Sie Ihre Methode readObject so ändern können, dass sie beim Aufruf transparent funktioniert, können Sie auch Folgendes verwenden:
public static <T> T readObject(String file, Class<T> type) throws Exception { return type.cast(readObject(new ObjectInputStream(new FileInputStream(file)))); }
Auf diese Weise muss der Aufrufer den Typ des Ergebnisses angeben, und der Compiler weiß, wie das Ergebnis umgewandelt wird.
quelle