java泛型知识:
泛型同注解一样,也分为定义和使用,比如JDK中集合框架对泛型进行了定义,而我们使用集合框架
时,就直接遵循定义进行了使用。
泛型的定义:
1、在类中进行定义
public class T4<E> {
private E e;
public void setE(E e){
this.e=e;
}
public E getE(){
return this.e;
}
}
也就是如以上的形式,在定义类的时候,定义该类中可能需要的泛型类
2、在方法上定义:
public class TT{
public <E> void test(E e){
}
}
3、定义泛型时加上该泛型的约束,默认的泛型实际上是表示继承Object类,可以在
定义时指定需要继承的类或实现的接口:
class TTT<E extends Map>{
}
这样在使用TTT的泛型时,该泛型必须实现Map接口。
两种定义方式的不同,也就是该泛型的使用范围不同,在类上定义的泛型,则在整个类中都可
使用;在方法上定义的泛型,只能在该方法中使用。
定义泛型时,不能在定义的类中实例化该泛型,例如,下面的用法就是错的:
class TTT<E>{
public void test(){
E e=new E();
}
}
编译器会提示“不能实例化类型 E”,这个的具体原因我不清楚,如果一定要实例化该泛型,
可以采取强制转换的方式,例如:
class TTT<E>{
public void test(){
E e=(E)new Object();
}
}
这个应该容易理解,因为没有显示指明类型,默认就是Object的子类。
泛型的使用:
使用泛型就比较容易了,记得当初学java集合框架的时候,很容易就理解了如何使用加上了
泛型的集合框架。不过作为知识的完备性,有一点还是要说一下,就是在使用泛型时,可以
使用这种语法来定义一个泛型引用:
public static void main(String[] args) {
T4<? extends List> tt=null;
tt=new T4<ArrayList>();
tt=new T4<LinkedList>();
}
这样就可以让tt这个引用指向任何实现了List接口的泛型类。不过这样做个人认为不是很合适,
本身泛型在使用时就是为了指明具体的类型,用这种方式使用,反而又模糊了使用的具体类型,
如果使用set(E)时,编译器会报错,因为它不知道具体要把一个什么类型set进去。
也就是说定义泛型时应当越抽象越好,而使用泛型时,则应越具体越好。
对泛型的总结:
泛型编程就是对处理的数据进行抽象,使得处理的算法具有普适性,也算是比较高级的编程了。
对泛型的定义,我还没有在开发中实践过,以后有了实践经验,再来总结。