泛型
为什么要使用泛型程序设计?
泛型程序设计意味着编写的代码可以对多种不同类型的对象重用。在泛型类之前,有一个ArrayList类就已经可以收集任意类型的对象。在增加泛型类之前,泛型程序设计使用继承来实现。ArrayList只维护一个Object引用的数组。
类型参数的好处?
var files = new ArrayList<String>();
和
ArrayList<String> files = new ArrayList<>();
等价。注意这样书写,只用在前面指明参数类型即可。
-
在这里通过菱形语法,指明了ArrayList中存放的是String类型的参数。编译器可以充分利用这个信息,在调用get()方法时,不用进行类型转换。
-
在编写代码时,编译器还可以进行检查,防止插入错误类型的对象。例如:调用add()方法时。书写了错误的类型对象是无法通过编译的。
泛型类
有一个或多个类型变量的类。
public class Pair<T,U> {...}
Java库使用变量E来表示集合的元素类型,K,V分别表示表的键和值的类型,T(必要时也可使用相邻的字母U,S)表示“任意类型”
可以使用具体的类型替换类型变量来实例化泛型实例。
pair<String>
泛型类相当于普通类的工厂
泛型方法
类型变量放在修饰符的后面,并在返回类型的前面。
public static <T> T getMiddle(T...a)
{
return a[a.length/2];
}
泛型方法可以在泛型类中定义,也可以在普通方法中定义
在调用泛型方法时可以把具体类型包围在尖括号中,放到方法名前。
String middle = ArrayAlg.<String>getMiddle("Jon","Q","Public");
通常类型参数可以省略,编译器可以推断出来。
类型变量的限定
public static <T extends Comparable> T min(T[] a)...
这里,限制了T只能是实现了Comparable接口的类。
这里因为Comparable是一个接口,所以使用extends关键字。
可以使用“&”来实现多个限定。