0
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>();
    }
}

请告诉我,为什么我在指向的字符串处出现编译错误,而在字符串上没有出现问题时。我知道如何解决该编译错误,但我想知道为什么在这种特殊情况下会有这种差异。

PS我知道编译错误可以通过f(new ArrayListGenerator().<String>list());

4

2 回答 2

0

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

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

    f(new ArrayListGenerator().<String>list());  
于 2013-05-30T09:48:48.297 回答
0

因为 Oracle 的编译器团队没有费心为第二种情况实现类型推断,而是为第一种情况(可以从分配表达式的变量推断类型)实现了类型推断。

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

于 2013-05-30T09:45:45.347 回答