----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
定义:
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。
泛型:是提供给编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入。但是泛型在运行的时候是没有作用的。
编译器在编译带类型说明的集合的时候会去掉类型信息,使程序运行效率不受影响,对于参数化的类型,getClass()方法的返回值和原始类型完全一致,由于编译生成的字节码信息会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其他类型数据。例如:用反射得到集合,在调用其add方法,就可以填写如其他类型。
ArrayList <E> 和ArrayList <Integer> 类引用中设计的术语
ArrayList <E> 叫做泛型类型
里面的E称为类型变量或类型参数
ArrayList <Integer> 叫做参数化类型
里面的Inerger叫做参数实例或实际参数类型
ArrayList 叫做原始类型
参数话类型和原始类型的兼容性
参数化类型可以引用原始类型对象,但是编译器会警告
Coollection <String> c = new Vertor();
原始类型可以引用一个参数化类型对象,但是也会报警
Collection c = new Vertor<String>();
类型化参数不考虑类型参数的继承关系(一下两种方式都是错误的)
Vector <String> v = new Vertor<Oblect>();
Vertor <Object> v = new Vertor<String>();
在创建数组实例的时候,数组的元素不能使用参数化的类型
例如:Vector <Integer> vList [] = new Vector<Titrger>[10];
//这是错的
通配符:使用“?”可以引用其他各种参数化的类型,详细见下面的转载。
规则和限制:
1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3、泛型的类型参数可以有多个。
4、泛型的参数类型可以使用extends语句,例如<T extendssuperclass>。习惯上称为“有界类型”。
5、泛型的参数类型还可以是通配符类型。例如Class<?> classType =Class.forName("java.lang.String");
泛型还有接口、方法等等,内容很多,需要花费一番功夫才能理解掌握并熟练应用。在此给出我曾经了解泛型时候写出的两个例子(根据看的印象写的),实现同样的功能,一个使用了泛型,一个没有使用,通过对比,可以很快学会泛型的应用,学会这个基本上学会了泛型70%的内容。
例子一:使用了泛型
classGen<T> {
private T ob; //定义泛型成员变量
public Gen(T ob){
this.ob = ob;
}
public T getOb(){
return ob;
}
public voidsetOb(T ob) {
this.ob = ob;
}
public voidshowType() {
System.out.println("T的实际类型是: " + ob.getClass().getName());
}
}
public classGenDemo {
public staticvoid main(String[] args){
//定义泛型类Gen的一个Integer版本
Gen<Integer>intOb=new Gen<Integer>(88);
intOb.showType();
int i=intOb.getOb();
System.out.println("value=" + i);
System.out.println("----------------------------------");
//定义泛型类Gen的一个String版本
Gen<String>strOb=new Gen<String>("Hello Gen!");
strOb.showType();
Strings=strOb.getOb();
System.out.println("value=" + s);
}
}
例子二:没有使用泛型
class Gen2 {
private Objectob; //定义一个通用类型成员
publicGen2(Object ob) {
this.ob = ob;
}
public ObjectgetOb() {
return ob;
}
public voidsetOb(Object ob) {
this.ob = ob;
}
public voidshowTyep() {
System.out.println("T的实际类型是: " + ob.getClass().getName());
}
}
public classGenDemo2 {
public staticvoid main(String[] args) {
//定义类Gen2的一个Integer版本
Gen2 intOb = newGen2(new Integer(88));
intOb.showTyep();
int i =(Integer) intOb.getOb();
System.out.println("value=" + i);
System.out.println("---------------------------------");
//定义类Gen2的一个String版本
Gen2 strOb = newGen2("Hello Gen!");
strOb.showTyep();
String s =(String) strOb.getOb();
System.out.println("value=" + s);
}
}
运行结果:
两个例子运行Demo结果是相同的,控制台输出结果如下:
T的实际类型是:
java.lang.Integer
value= 88
----------------------------------
T的实际类型是: java.lang.String
value= HelloGen!
Process finishedwith exit code 0
以下为转载
4通配符
|
|
错误方式:
|
| |
|
|
|
| |
|
|
|
|
正确方式:
|
|
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| ||
|
|
|
|
有限制的通配符
a.限定通配符的上边界:(?必须是Number的子类)
b.限定通配符的下边界 : (?必须是Integer的父类)
C.限定范围总是包括自己
泛型的通配符扩展应用案例
|
| ||
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| ||
|
|
|
| |
|
|
|
| |
|
|
|
| ||
|
|
|
| |
|
|
自定义泛型方法
|
|
泛型方法定义规则:
Java程序中的普通方法、构造方法和静态方法中都可以使用泛型。方法使用泛形前,必须对泛形进行声明,语法:<T>,T可以是任意字母,但通常必须要大写。<T>通常需放在方法的返回值声明之前。
例如:
public static <T> void doxx(T t);
泛型方法定义注意问题:
•只有对象类型才能作为泛型方法的实际参数。
•在泛型中可以同时有多个类型.
例如:
public static <K,V> V getValue(K key) { return map.get(key);}
public static <K extends Annotation> void getXX(){}
public static <K extends Annotation & Cloneable> voidgetXX(){}
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
自定义泛型类
如果一个类多处都要用到同一个泛型,这时可以把泛形定义在类上(即类级别的泛型)
语法格式如下:
public classGenericDao<T> {
private T field1;
public void save(T obj){}
public T getId(int id){}
}
注意: 静态方法不能使用类定义的泛形,而应单独定义泛形。先使用类级别的泛型.
泛形的典型应用:BaseDao
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
8.通过反射获取泛型的实际类型参数
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
| ||
|
|
|
| |
|
|
|
| ||
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
|
|
|
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------