Подтвердить что ты не робот

Ошибка в компиляторе 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?

4b9b3361

Ответ 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))));
}

Таким образом, вызывающий пользователь должен указать тип результата, а компилятор знает, как отличать результат.