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());
答案 0 :(得分:0)
因为Oracle的编译团队并没有为第二种情况实施类型推断,而是针对第一种情况(可以从表达式分配给的变量推断出类型)来做到这一点。
Java 8在类型推断方面有很大的改进,所以如果使用Java 8编译器进行编译,我不会感到惊讶。
答案 1 :(得分:0)
当调用没有类型参数的泛型方法时,它将使用原始类型(无类型推断)。当在代码行中给出类型时,类型推断起作用(第一种情况)。
当然,将<String>
放在方法名list
前面可以澄清并防止错误:
f(new ArrayListGenerator().<String>list());