什么是泛型
泛型是jdk5引入的类型机制,就是将类型参数化,它是早在1999年就制定的jsr14的实现。
泛型机制将类型转换时的类型检查从运行时提前到了编译时,使用泛型编写的代码比杂乱的使用object并在需要时再强制类型转换的机制具有更好的可读性和安全性。
泛型程序设计意味着程序可以被不同类型的对象重用,类似c++的模版。
泛型对于集合类尤其有用,如ArrayList。这里可能有疑问,既然泛型为了适应不同的对象,ArrayList本来就可以操作不同类型的对象呀?那是因为没有泛型之前采用继承机制实现的,实际上它只维护了一个Object对象的数组。结果就是对List来说它只操作了一类对象Object,而在用户看来却可以保存不同的对象。
泛型提供了更好的解决办法——类型参数,如:
List list = new ArrayList();
这样解决了几个问题:
1 可读性,从字面上就可以判断集合中的内容类型;
2 类型检查,避免插入非法类型。
3 获取数据时不在需要强制类型转换。
泛型类
public class Pair{
private T field1;
}
其中 <T> 是类型参数定义。
使用时:Pair<String> p = new Pair<String>();
此时类内部的field1就是字符串类型了。
如果引用多个类型,可以使用逗号分隔:<S, D>
类型参数名可以使用任意字符串,建议使用有代表意义的单个字符,以便于和普通类型名区分,如:T代表type,有原数据和目的数据就用S,D,子元素类型用E等。当然,你也可以定义为XYZ,甚至xyZ。
泛型方法
泛型方法定义如下:
public static T marshalle(T arg){}
与泛型类一样,<T> 是类型参数定义。如:
public class GenericMethod {
public static T getMiddle(T… a){
return a[a.length/2];
}
}
严格的调用方式:
String o=GenericMethod.getMiddle(“213”,”result”,”12”);
一般情况下调用时可以省略,看起来就像定义String类型参数的方法: GenericMethod.getMiddle(String,String,String),这是因为jdk会根据参数类型进行推断。看一下下面的例子:
Object o=GenericMethod.getMiddle(“213”,0,”12”);
System.out.println(o.getClass());
System.out.println(o);
输出结果为:
class java.lang.Integer
0
这是因为jdk推断三个参数的共同父类,匹配为Object,那么相当于:
Object o=GenericMethod.getMiddle(“213”,0,”12”);
习惯了类型参数放在类的后面,如ArrayList<String>,泛型方法为什么不放在后面?看一个例子:
public static