为什么编译器能够在函数返回类型的情况下正确推断出String
类型参数。
public class Generics {
private static List<String> function() {
return new ArrayList<>();
}
}
但是当要推断的类型是方法参数时它会失败:
public class Generics {
public static void main(String[] args) {
method(new ArrayList<>());
}
private static void method(List<String> list) {
}
}
这种情况下的错误是:
The method method(List<String>) in the type Generics is not applicable
for the arguments (ArrayList<Object>)
答案 0 :(得分:16)
这是类型推断尚未按预期工作的地方之一。
不幸的是,这种行为完全有效且符合要求。
好消息是Java 8将包含improved type inference (JEP 101),所以这样的情况应该按照您的预期进行编译:
当将这种泛型方法调用的结果传递给另一个方法[...]时,编译器应该能够推断出类型似乎是合理的。
不幸的是,在JDK 5/6/7中不允许这样做 - 程序员可用的唯一选择是使用显式类型参数。
除了直接改进(例如你在这里提到的情况)之外,这种变化对于能够更有效地使用Lambdas (JEP 126)也是必要的(即无需输入大量类型信息)。 / p>
答案 1 :(得分:6)
JLS中关于inferring unresolved type arguments的部分相当复杂,但据我所知,第一个案例的钻石出现在受赋值转换约束的地方,而在第二种情况,它发生在方法调用转换中,遵循不同的规则。