Ошибка в компиляторе eclipse или в javac ("параметры типа T не могут быть определены")
следующий код
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();
}
}
компилируется в eclipse,но не с javac (параметры типа T не могут быть определены; не существует уникального максимального экземпляра для переменной типа T с верхними границами T, java.ленг.Объект.)
когда я изменяю readObject (String file) на
@SuppressWarnings("unchecked")
public static <T> T readObject(String file) throws Exception {
return (T)readObject(new ObjectInputStream(new FileInputStream(file)));
}
он компилируется в eclipse и с javac. Кто прав, компилятор eclipse или javac?
5 ответов:
в этом случае я бы сказал, что ваш код неверен (и компилятор Sun прав). В ваших входных аргументах нет ничего
readObject
чтобы фактически вывести типT
. В этом случае вам лучше позволить ему вернуть объект, и пусть клиенты вручную приведут тип результата.Это должно работать (хотя я не проверял это):
public static <T> T readObject(String file) throws Exception { return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file))); }
Oracle JDK6 u22 должен быть правильным, но у меня эта проблема с JDK6 u24 тоже
Это ошибка затмения ошибка 98379.
Это не было исправлено, но проблема решена с помощью обходного пути, как пример в Eclipse ошибок (см. ссылку)
Я нашел эту проблему в Java-версии "1.6.0_22". Он исчез, когда я обновился до версии java "1.6.0_32", как это было исправлено в обновлении 25.
Если вы можете изменить свой метод readObject для прозрачной работы при вызове, вы также можете использовать следующее:
public static <T> T readObject(String file, Class<T> type) throws Exception { return type.cast(readObject(new ObjectInputStream(new FileInputStream(file)))); }
таким образом, абонент будет вынужден указать тип результата и компилятор знает, как привести результат.