Мой вопрос является продолжением вопроса другого парня: Неограниченный шаблон, переданный методу
Его интересовало, почему скомпилирован следующий код:
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?