Java 奇异参数化方法 公共类方法{ 静态void f(ArrayList列表){}; 公共静态void main(字符串…参数){ ArrayList list=新建ArrayListGenerator().list();//无问题分配 f(新ArrayListGenerator().list());//编译错误 } } 类ArrayListGenerator{ ArrayList列表(){ 返回新的ArrayList(); } }

Java 奇异参数化方法 公共类方法{ 静态void f(ArrayList列表){}; 公共静态void main(字符串…参数){ ArrayList list=新建ArrayListGenerator().list();//无问题分配 f(新ArrayListGenerator().list());//编译错误 } } 类ArrayListGenerator{ ArrayList列表(){ 返回新的ArrayList(); } },java,generics,methods,parameterized,generic-programming,Java,Generics,Methods,Parameterized,Generic Programming,请告诉我,为什么我在指向的字符串上出现编译错误,而在字符串上没有问题发生。我知道如何解决编译错误,但我想知道为什么在这种特殊情况下会有这样的差异 另外,我知道编译错误是通过f(newarraylistgenerator().list())解决的,因为Oracle的编译器团队没有为第二种情况实现类型推断,而是为第一种情况实现了类型推断(在第一种情况下,类型可以从表达式分配给的变量推断) Java 8在类型推断方面有了很大的改进,因此如果使用Java 8编译器编译它,我不会感到惊讶。当调用没有类型参

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


另外,我知道编译错误是通过
f(newarraylistgenerator().list())解决的

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


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

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

当然,将
放在方法名
列表的前面可以澄清并防止错误:

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>();
    }
}
f(新的ArrayListGenerator().list());

谢谢,但我写过“我知道如何解决编译错误,但我想知道为什么在这种特殊情况下会有这样的差异。”是的,但你没有证明你确实理解如何“解决”编译错误,也没有告诉任何不知道的读者。就像你没有提到你的错误一样。
    f(new ArrayListGenerator().<String>list());