java泛型的Type Inference

Java类型推断详解
本文详细介绍了Java中的类型推断(type inference)概念及其应用场景。包括使用泛型类实例化时的Java 7 diamond语法、调用泛型方法、返回泛型方法时的类型推断,以及Java 8中如何根据目标参数进行类型推断等。

关于type inference

常见场景:
1、泛型
类实例化,调用构造器时:

Map<String, List<String>> myMap = new HashMap<>();

Java 7 diamond语法:调用泛型类的构造器时可以用空尖括号只要上下文可推断。称作diamond。
注意:想让type inference推断时必须要有尖括号,不写尖括号会导致unchecked。
2、调用普通泛型方法时:
例1:

BoxDemo.<Integer>addBox(Integer.valueOf(10), listOfIntegerBoxes);

可简写为:

BoxDemo.addBox(Integer.valueOf(10), listOfIntegerBoxes);

例2:

List<String> list = new ArrayList<>();
list.addAll(new ArrayList<? extends String>);//在java7中要具体写出
//list.addAll(new ArrayList<>());//也可以,java8允许

这里List的addAll方法的参数expect的是ArrayList<? extends String>(),根据第4种场景的说明,编译器推测newArrayList()是个newArrayList<? extends String>(),因此list.addAll(new ArrayList<>()) 也是允许的。
这里要记住的要点就是 要传给方法它expect的参数类型的实例。不管这个实例是个对象应用还是个基本类型的值。

3、调用有返回值的泛型方法并赋值时,根据target types推断参数类型:

static <T> List<T> emptyList();
List<String> listOne = Collections.emptyList();

4、java 8:根据target types推断参数类型扩展至可以根据target argument来推断
例子:

void processStringList(List<String> stringList) {
    // process stringList
}
processStringList(Collections.emptyList());

这里Collections.emptyList()返回的时List,而processStringList方法expect的参数时List,于是编译器推测T是String

5、泛型/非泛型类都可以有泛型的构造器。
泛型方法中的泛型构造器:

class MyClass<X> {
  <T> MyClass(T t) {
    // ...
  }
}

对它的调用:
1)

new MyClass<Integer>(“”)

//这句说明创建了一个X为Integer的MyClass实例,并调用的是这个构造器,且构造器的类型参数T是String,这是java通过参数””type inference出来的。
2)

MyClass<Integer> myObject = new MyClass<>("");

//这里的<>和“”都利用了type inference

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值