Java之路:泛型

Java的类集框架在本质上就相当于容器,而容器中装的是什么东西需要程序员指定。为了实现了算法与数据类型的无关性以及容器(数据结构)与数据类型的无关性,所以就引出了泛型的概念。
泛型是Java SE 1.5之后引入的新特性,泛型的本质是数据类型参数化,也就是说,所操作的数据类型被指定为一个参数。 这种类型变量可以用在类、接口和方法的创建中。

例:

List<Apple> box=new ArrayList<Apple>();
box.add(new Apple());
Apple apple=box.get(0);

这种get方法返回的就是Apple类型,而不是Object类型。

泛型的优点在于提供了容器(数据结构)与数据类型的无关性,并且可以向后兼容
泛型的缺点就是每次定义时都要写明泛型的类型,这样显式指定泛型类型不仅感觉有些冗长,最主要的是很多程序员不熟悉泛型,因此有时不能给出正确的类型参数。

如果能通过编译器自动推断泛型的参数类型,这样就能够减少这样的情况,并提高代码可读性。

JDK7中添加了尖括号<>操作符,表示是自动类型推断,所以上面的代码在JDK 7中的写法为:

List<Apple> box = new ArrayList<>();
box.add(new Apple());
Apple apple = box.get(0);

上面第01行代码中,编译器自动推断等号右边的尖括号中的泛型为Apple。

在Java 8中,进一步强化了泛型的推断能力。Java 8里面泛型的目标类型推断主要有2个:(1)支持通过方法上下文推断泛型目标类型。
(2)支持在方法调用链路当中,泛型类型推断传递到最后一个方法。

先看下官方文档提供的例子:

class List<E>{
	static<Z>List<Z>nil(){...};
	static<Z>List<Z>cons(Z head,List<Z>tail){...};
	E head(){...}
}
//通过方法赋值的目标参数来自动推断泛型的类型
List<String> l = List.nil();
//而不是显式地指定类型
//List<String> l = List.<String>nil();
//通过前面方法参数类型推断泛型的类型
List.cons(42, List.nil());
//而不是显式地指定类型
//List.cons(42, List.<Integer>nil());

由于Java 8的Lambda表达式的引入,以及对原有接口中内容的大量修改,所以接口引入了默认方法的概念。

猜你喜欢

转载自blog.csdn.net/qq_43555323/article/details/84958310