本文是《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()。