为什么在函数返回类型的情况下,编译器能够正确推断出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>)
这是类型推断尚未按预期工作的地方之一。
不幸的是,这种行为是完全有效和一致的。
好消息是Java 8将包括改进的类型推断(JEP 101),所以像这样的情况应该像您期望的那样编译:当这种泛型方法调用的结果传递给另一个方法[…]时,编译器应该能够推断出类型,这似乎是合理的。
不幸的是,这在JDK 5/6/7中是不允许的——程序员唯一可用的选择是使用显式的类型参数。
除了直接的改进(例如,您在这里提到的情况)之外,这个更改对于能够更有效地使用Lambdas (JEP 126)也是必要的(例如,无需键入大量类型信息)。
关于在JLS中推断未解析的类型参数的部分相当复杂,但我理解第一种情况的菱形出现在受赋值转换约束的地方,而在第二种情况中,它出现在方法调用转换中,它们遵循不同的规则。