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