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

5 ответов:

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

return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));

в этом случае я бы сказал, что ваш код неверен (и компилятор 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))));
}

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