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