Java 7泛型类型推断:返回值vs方法参数



为什么在函数返回类型的情况下,编译器能够正确推断出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中推断未解析的类型参数的部分相当复杂,但我理解第一种情况的菱形出现在受赋值转换约束的地方,而在第二种情况中,它出现在方法调用转换中,它们遵循不同的规则。

最新更新