------- android培训、java培训、期待与您交流! ----------
1.泛型的概念
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,称之为泛型类、泛型接口、泛型方法。
Java语言引入泛型的好处是:
(1)将运行时期出现问题ClassCastException 转移到了编译时期,方便于程序员解决问题,让运行时的问题减少,安全;
(2)不需要进行麻烦的类型的强制转换。
2.了解泛型
(1)ArrayList<E>类定义和ArrayList<Integer>类涉及如下术语:
ArrayList<E>称为泛型类型
E称为类型变量或者类型参数
ArrayList<String>称为参数化的泛型
String称为类型参数的实例或者实际类型参数
<>念typeof
ArrayList称为原始类型
(2)参数化类型与原始类型的兼容性
参数化类型可以引用一个原始类型的对象,只是编译报告警告,例如,
Collection<String> c=new Vector();
原始类型可以引用一个参数类型的对象,只是编译报告警告,例如,
Collection c=new Vector<String> ();
(3)参数化类型不考虑类型参数的继承关系,必须一一对应
Vector<String> v=new Vector<Object>();//是错误的
Vector<Object> v=new Vector<String>();//也是错误的
在创建数组实例时,数组的元素不能使用参数化的类型,例如,下面语句是错误的:
Vector<String> VectorList[]=new Vector<String>[10];
3.泛型通配符“?”(不能确定类型参数)
使用?统配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数有关的方法。
?通配符的扩展,限定通配符的上边界用extends,限定通配符的下边界用super,而且限定通配符总是包括自己。
例如:
上边界:Vector<? extends Number> v = new Vector<Integer>;
下边界:Vector<? super Integer> v = new Vector<Number>;
4.自定义泛型
注意:泛型类型只能是引用类型,不能是基本类型。
泛型类:当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在定义泛型类来扩展。
例:class Demo<T>{
Public void show(T t){
}
}
泛型方法:泛型类定义的泛型,在整个类中有效,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就固定了。 为了让不同方法可以操作不同类型,而且类型还不确定,那么可以将泛型定义在方法上。
例:class Demo{
Public <T> void show(T t){
}
}
特殊之处:static方法,无法访问泛型类的类型参数,所以,若要static方法需要使用泛型能力,必须使其成为泛型方法。
如:public static <T> void show(T t){
}
泛型定义在接口上:
Interface Inter<T>{
Void show(T t);
}
实现接口的两种方法:
(1) class InterImpl implements Inter<String>{
Public void show(String t){
System.out.println(“show:”+t);
}
}
(2) (2)class InterImpl<T> implements Inter<T>{
Public void show(T t){
System.out.println(“show:”+t);
}
}
注意:(1)在对泛型进行参数化时,类型参数的实例必须是引用类型,不能是基本
类型;
(2)当一个变量被声明为泛型时,只能被实例变量和方法调用(还有内嵌类
型),而不能被静态变量和静态方法调用,因为静态成员是被所有参数
化的类所共享的,所以静态成员不应该有类级别的类型参数。