0%

Java语言新特性漫谈:Java 8之类型推断

本文是《Java语言新特性漫谈》系列文章中的一篇,该系列文章主要探讨各 Java 版本的语言特性方面的增强更新。

Java 8 编译器增强了类型推断能力,可利用泛型方法调用推断类型参数。

类型推断是 Java 编译器的一种能力,它通过查看每个方法调用和相应声明以确定调用适合的类型参数。

Java 7 只实现了赋值语句中的类型推断,即所谓的“菱形语法”或“钻石运算符”,如 List<String> stringList = new ArrayList<>();

比如:

1
2
3
List<String> stringList = new ArrayList<>();
stringList.add("A");
stringList.addAll(Arrays.asList());

注意,Arrays.asList() 是个泛型方法,它返回类型为 List<T>,而 List.addAll() 参数类型为 Collection<? extends String> ,因此可以推断出 Arrays.asList() 泛型类型参数为 String

对于 Java 7 而言,编译器还没有这么强的推断能力,因此,由于上面的代码中 Arrays.asList() 没有指定类型的,即视为 Object。故编译器将输出类似如下的错误:

error: no suitable method found for addAll(List<Object>)
method List.addAll(Collection<? extends String>) is not applicable (actual argument List<Object> cannot be converted to Collection<? extends String> by method invocation conversion)

除非显式指定泛型类型,比如:Arrays.<String>asList()

扩展参考

Lambda 表达式中的目标类型

类型推断