2011-10-19 153 views
3

我的问题是其他人的问题的追问:Unbounded wildcard passed to methodJava泛型Eclipse编译器错误?

他很感兴趣,为什么下面的代码编译:

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,并且由于Object-> Long的普通继承而使下面的Long参数通过。

的代码不会编译使用Sun /甲骨文的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) 

我的问题是:

这是Eclipse中使用的Java编译器实现中的错误还是Java中的泛型推理算法规范中的某种模糊性?

回答

3

它似乎是一个Eclipse错误。

T应该推断为每15.12.2.7的Object。

15.12.2.8还具有捕获所有子句:“尚未被推断然后推断出任何残留的类型变量为具有类型对象”

与T =对象,每15.12.2.2,该方法是适用

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

+0

我需要分析它多一点(什么是野兽!),但可以得到的感谢能拉的努力与这样的书呆子的问题没有太大的声誉的唯一的人。尊重! – MarianP