Ошибка компилятора в Eclipse? - PullRequest
3 голосов
/ 19 октября 2011

Мой вопрос является продолжением вопроса другого парня: Неограниченный шаблон, переданный методу

Его интересовало, почему скомпилирован следующий код:

public class ColTest {
    static<T> T wildSub(ArrayList<? extends T> holder, T arg){
        T t=holder.get(0);
        return t;
    }

    public static void main(String[] args) {
        ArrayList<?> list=new ArrayList<Long>(Arrays.asList(2L,3L,7L));
        Long lng=1L;
        ColTest.wildSub(list, lng);
    }
}

Мы пришли к выводу, что хитрость заключалась в том, что компилятор выводил? как Object и передал следующий аргумент Long благодаря тривиальному наследованию Object-> Long.

Код компилируется с использованием Sun / Oracle javac (я использую 1.6.0_26-b03), но не компилируется в Eclipse (я использую Helios), где отображается следующая ошибка компиляции:

The method wildSub(ArrayList<? extends T>, T) in the type ColTest is not applicable for the arguments (ArrayList<capture#2-of ?>, Long)

Мой вопрос:

Это ошибка в реализации компилятора Java, которую использует Eclipse, или какая-то двусмысленность в спецификации Java 'generics выводного алгоритма', которая действительна и просто по-разному реализована в Eclipse?

1 Ответ

4 голосов
/ 20 октября 2011

Кажется, это ошибка Eclipse.

T следует обозначить как Object, согласно 15.12.2.7.

15.12.2.8 также имеет условие catch-all: «Все оставшиеся переменные типа, которые еще не были выведены, получают вывод типа Object»

с T = Object, согласно 15.12.2.2, метод применим .

http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12

...