泛型
基本介绍
-
泛型又称参数化类型,是JDK5.0出现的新特性,解决数据类型的安全性问题
-
在类声明或实例化时只要制定好需要的具体的类型即可
-
Java泛型可以保证如果程序在编译时没有发出警告,运行时不会产生
ClassCastException
异常。同时有助于代码简洁、强壮 -
泛型的作用:可以在类声明时通过一个标识表示类中某一个属性的类型,或者是某个方法的返回值的类型,或者是参数类型
//在Java增加泛型类前,泛型通过继承实现
public class ArrayList{
private Object[] elementData;
...
public Object get(int i){...}
public void add(Object o){...}
}
这会导致两个问题:
//1.取值时必须强制类型转换
ArrayList files = new ArrayList();
...
String filename = (String)files.get(0);
//2.没有错误检查。这就可以向数组列表中添加任何类的对象
files.add(new File("..."));
这样调用,编译和运行都不会出错。但在别的情况,如果把get的结果强制转换为String就可能产生错误。
定义简单泛型类
public class Pair<T,U> {
private T first;
private U second;
public Pair(){
this.first = null;
this.second = null;
}
public Pair(T first, U second) {
this.first = first;
this.second = second;
}
public T getFirst() {
return first;
}
public void setFirst(T first) {
this.first = first;
}
public U getSecond() {
return second;
}
public void setSecond(U second) {
this.second = second;
}
}
//类型变量放在类名后面,泛型类可以有多个类型变量, 像是<K,V>这样的结构
泛型方法
class ArrayAlg{
public static <T> T getMiddle(T... a){
return a[a.length / 2];
}
}
-
类型变量放在修饰符的后面,返回类型的前面
-
泛型方法可以定义在普通类中,也可以定义在泛型类中
-
调用泛型方法时,在方法名前的尖括号放入具体的类型(大多数情况可以忽略类型参数,编译器会帮助我们推断类型)
类型变量的限定
通过给类型变量T设定上界,保证T所属的类都是上界类型及其子类,确保T对方法的正常调用
<T extends BoundingType>
//选择关键字extends的原因是更接近子类的概念
<T extends Comparable & Serializable>
//一个类型变量或通配符可以有多个限定
//限定类型用“&”隔开,逗号用于分隔类型变量
在java的继承中,可以根据需要拥有多个接口超类型,但限定中至多有一个类(单继承机制相关)。如果用一个类作为限定,他必须是限定列表中的第一个。