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

2022-09-01 19:20:36

为什么编译器能够在函数返回类型的情况下正确推断类型参数。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>)

答案 1

这是类型推断尚未按预期工作的地方之一。

不幸的是,这种行为是完全有效和符合的。

好消息是,Java 8将包括改进的类型推理(JEP 101),所以像这样的情况应该按照你的期望进行编译:

当这种泛型方法调用的结果传递给另一个方法时,编译器应该能够推断出类型,这似乎是合理的[...]。

不幸的是,这在 JDK 5/6/7 中是不允许的 – 程序员唯一可用的选项是使用显式类型参数。

除了直接改进(即您在此处提到的情况)之外,此更改对于能够更有效地使用Lambdas(JEP 126)也是必要的(即不必键入大量类型信息)。


答案 2

关于在JLS中推断未解析的类型参数的部分相当复杂,但我理解第一种情况下的菱形发生在它进行赋值转换的地方,而在第二种情况下,它发生在遵循不同规则的方法调用转换中


推荐