出处:http://blog.csdn.net/snowcoldy/article/details/6745715
1、泛型的意义:
往小处说,是为了实现类型安全的集合
往大处说,是为了实现模版编程的理念
2、为什么要出现泛型:
虽然集合具有长度可扩充、插入删除方便等强大的特性
但是集合内部可以存储的对象是类型不安全的
释义:
什么是类型不安全:
因为集合内部可以装入/取出的元素是Object类型
因此任何对象都能够往里装
这时若想要从集合中取得一个String对象时
则必须要在取出后将其强制转换成String类型
但是如果取出的对象并非String类型的对象
则强制转换就会发生错误,这就是类型不安全
因此采用泛型是为了实现类型安全,同时提高程序的可读性
3、泛型的含义:
简单地理解,泛型的含义就是,在定义集合的时候,就指定集合内部可以装入对象的类型。
这样该集合内就只能装入该种类型的对象,同时取出的对象也是该种类型的,而不再是Object。
定义的格式是:
List <String> list = new Arraylist <String> ();
这样list.add("ABC");是合法的,list.add(123);就是非法的
同时String s = list.get(0);是合法的,而不需要再次进行强制类型转换
/*********以下内容为扩展知识*********/
4、不同泛型的集合不能够相互赋值:
只有泛型相同的集合之间才能够相互赋值
不支持泛型为子类的集合赋值给泛型为父类的集合
例如:
public void print(List <Object> list) {
for(Object o:list) {
System.out.println(o);
}
}
List <String> list1 = new ArrayList <String> ();
List <Object> list2 = new ArrayList <Object> ();
print(list1); //非法
print(list2); //合法
5、通配符"?"
以上问题的解决方法是:
public void print(List <?> list) {
for(Object o:list) {
System.out.println(o);
}
}
List <String> list1 = new ArrayList <String> ();
List <Object> list2 = new ArrayList <Object> ();
print(list1) //合法
print(list2) //合法
*?是泛型的通配符,可以代表任意一个泛型
*也可以限制?可以代表泛型的泛围,语法是:
<? extends String> //限制该泛型只能是String或String的子类
<? extends Comparable> //限制该泛型只能是Comparable的实现类(注意这里用的也是extends)
<? super Number> //限制该泛型只能是Number或Number的父类
6、定义泛型方法:
格式:在方法的返回值前面加上<T>,可以使方法称为泛型方法(模版)
作用:用于统一方法内部的参数类型,T的类型由调用该方法时的参数决定
例子:
public class TestGenerics3 {
//定义泛型方法,定义方法的泛型为T
//那么,该方法的参数指定T的具体类型是什么,T的类型就是什么
public static <T> void copyFromArray(List<T> list,T[] os){
for(T o:os){
list.add(o);
}
}
public static void main(String[] args) {
List<String> l1=new ArrayList<String>();
List<Number> l2=new ArrayList<Number>();
List<Integer> l3=new ArrayList<Integer>();
List<Double> l4=new ArrayList<Double>();
List<Object> l5=new ArrayList<Object>();
String[] o1=new String[10];
Number[] o2=new Number[10];
Integer[] o3=new Integer[10];
Double[] o4=new Double[10];
Object[] o5=new Object[10];
copyFromArray(l1,o1); //l1的类型是String,o1的类型是String,因此T的类型也被指定为String
copyFromArray(l2,o2); // T:Number
copyFromArray(l3,o3); //T:Integer
copyFromArray(l4,o4); //T:Double
copyFromArray(l5,o5); //T:Object
}
}
7、定义泛型类:
格式:在类名后面加上<T>,可以使该类称为泛型类
作用:用于动态决定类内部的方法参数类型和返回值类型
例子:
//定义一个接口,定义接口的泛型为T
//那么,该接口的实现类指定T的具体类型是什么,T的类型就是什么
interface I <T> {
T method(); //指定该方法的返回值类型为T
}
//指定接口I内的T为String类型
class IC1 implements I <String>{
public String method(){ //那么该方法的的返回值类型就是String
return "hehe";
}
}
//指定接口I内T为Collection类型
class IC2 implements I <Collection>{
public Collection method(){ //那么该方法的返回值类型就是Collection
return new ArrayList();
}
}