java泛型推断从java6到java8的变化

来源:互联网 发布:巨龙软件工程有限公司 编辑:程序博客网 时间:2024/05/18 01:44

java6中:

Map<Person, List<? extends Pet>> petPeople = new HashMap<Person, List<? extends Pet>>();

不能够省略new后面类型参数部分。但是,使用泛型方法的类型参数推断可以简化一部分工作。

public class New {    public static <K, V> Map<K, V> map() {        return new HashMap<K, V>();    }}Map<Person, List<? extends Pet>> petPeople = New.map();

通过工具类New的静态泛型方法map,可以简化一部分工作。但是,这种类型推断只对赋值操作有效,而无法将New的map方法的返回值传递给另一个方法作为参数使用。如果想要使用,需要这么做:

New.<Person, List<? extends Pet>>map(); // 静态方法 this.<Person, List<? extends Pet>>map(); // 非静态方法

是因为map方法没有参数,所以无法进行推断,需要显式的类型说明。

java7中:

Map<Person, List<? extends Pet>> petPeople = new HashMap<>();

diamond菱形操作符可以使new后面的类型参数得以省略。但是,7中的类型推断还是有限制的,即只有构造器的参数化类型在上下文中别明显地声明了才可以。

List<String> list = new ArrayList<>();list.addAll(new ArrayList<>()); // 在java7中无法编译,而在java8中可以编译

java8中:

List<String> list = new ArrayList<>();list.addAll(new ArrayList<>()); // 可以编译

java8中可以根据方法的声明来推断泛型的类型。

原创粉丝点击