Ошибка в компиляторе затмения или в javac («параметры типа T не могут быть определены») - PullRequest
74 голосов
/ 24 ноября 2008

следующий код

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 file) на

    @SuppressWarnings("unchecked")
    public static <T> T readObject(String file) throws Exception {
        return (T)readObject(new ObjectInputStream(new FileInputStream(file)));
    }

компилируется в затмении и с использованием javac. Кто прав, компилятор затмения или javac?

Ответы [ 5 ]

66 голосов
/ 03 декабря 2008

Я бы сказал, что это ошибка в компиляторе Sun, о которой сообщалось здесь и здесь , потому что если вы измените свою строку на нижнюю, она будет работать с обоими, что, кажется именно то, что описано в сообщениях об ошибках.

return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));
13 голосов
/ 24 ноября 2008

В этом случае я бы сказал, что ваш код неверен (а компилятор Sun верен). В ваших входных аргументах readObject нет ничего, что фактически выводило бы тип T. В этом случае лучше позволить ему вернуть Object и позволить клиентам вручную привести тип результата.

Это должно работать (хотя я не проверял):

public static <T> T readObject(String file) throws Exception {
    return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));
}
3 голосов
/ 29 марта 2011

Oracle JDK6 u22 должен быть корректным, но у меня такая же проблема с JDK6 u24

Это ошибка Eclipse Ошибка 98379 .

Это не было исправлено, но проблема решена с помощью обходного пути, как, например, в ошибках Eclipse (см. Ссылку)

1 голос
/ 11 марта 2015

Я нашел эту проблему в Java-версии "1.6.0_22". Он исчез при обновлении до версии Java "1.6.0_32", как это было исправлено в обновлении 25.

0 голосов
/ 03 апреля 2012

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

public static <T> T readObject(String file, Class<T> type) throws Exception {
    return type.cast(readObject(new ObjectInputStream(new FileInputStream(file))));
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...