java8新特性-提升了泛型的类型推断

1.jdk1.7之前的泛型

泛型是在jdk1.5中加入,在jdk1.7之前,java的泛型写法,是经常被人诟病的,诸如List<String> list = new ArrayList<String>();这段代码,很多开发人员都会问,为什么我声明时指明了类型,在创建时还要我再次指明类型?

2.jdk1.7中的泛型

在1.7中,这个问题得到了一定的改善,List<String> list1 = new ArrayList<>();;你可以在声明中指明类型,创建时无需再指明,编译器会自动推断目标类型。但是这种推断,只可以用在new创建对象时,而无法用在方法的参数中。比如下面这段代码,第2行会报错误。

1
2
List<String> list1 = new ArrayList<>();
list1.addAll(Arrays.asList());

3.jdk1.8中的泛型

jdk1.8中,类型推断进一步得到了增强,可以推断方法参数中的泛型了。List.addAll(Collection<? extends E> c)编译器会根据我们声明List<String> stringList = new ArrayList<>();时指定的类型,来推断参数中的泛型目标类型。下面的代码,在jdk1.8中都可以正常编译执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package me.momotime.java8.generics;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 泛型测试
* @author momo.
*/
public class GgenericsTest {
public static void main(String args[]){
//jdk 1.7之前
List<String> list = new ArrayList<String>();
// jdk1.7时
List<String> list1 = new ArrayList<>();
//list1.addAll(Arrays.asList()); 此行在jdk1.7环境是错误的
// jdk1.8中
List<String> stringList = new ArrayList<>();
stringList.addAll(Arrays.asList());
}
}