奇怪的参数化方法

时间:2013-05-30 09:34:11

标签: java generics methods parameterized generic-programming

public class StrangeParamMethod {

    static void f(ArrayList<String> list){};

    public static void main(String... args){
        ArrayList<String> list = new ArrayListGenerator().list(); //assigns without problems
        f(new ArrayListGenerator().list());  //compile error
    }
}

class ArrayListGenerator   {
    <K> ArrayList<K> list(){
        return new ArrayList<K>();
    }
}

请告诉我,为什么我在指向的字符串处得到编译错误,当字符串结束时没有问题发生。我知道如何解决编译错误,但我想知道为什么在这种特殊情况下存在这样的差异。

P.S。我知道编译错误由f(new ArrayListGenerator().<String>list());

解决

2 个答案:

答案 0 :(得分:0)

因为Oracle的编译团队并没有为第二种情况实施类型推断,而是针对第一种情况(可以从表达式分配给的变量推断出类型)来做到这一点。

Java 8在类型推断方面有很大的改进,所以如果使用Java 8编译器进行编译,我不会感到惊讶。

答案 1 :(得分:0)

当调用没有类型参数的泛型方法时,它将使用原始类型(无类型推断)。当在代码行中给出类型时,类型推断起作用(第一种情况)。

当然,将<String>放在方法名list前面可以澄清并防止错误:

    f(new ArrayListGenerator().<String>list());