本文是《Java语言新特性漫谈》系列文章中的一篇,该系列文章主要探讨各 Java 版本的语言特性方面的增强更新。
Java 8 编译器增强了类型推断能力,可利用泛型方法调用推断类型参数。
类型推断是 Java 编译器的一种能力,它通过查看每个方法调用和相应声明以确定调用适合的类型参数。
Java 7 只实现了赋值语句中的类型推断,即所谓的“菱形语法”或“钻石运算符”,如
List<String> stringList = new ArrayList<>();
比如:
1 | List<String> stringList = new ArrayList<>(); |
注意,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>)
…
methodList.addAll(Collection<? extends String>)
is not applicable (actual argumentList<Object>
cannot be converted toCollection<? extends String>
by method invocation conversion)除非显式指定泛型类型,比如:
Arrays.<String>asList()
。