总结一:泛型总结
泛型的理解应建立在泛型应用的场景中,泛型的应用场景总结起来有以下集中:
1、 容器中使用泛型(包括在迭代器-Iterator和Comparable中使用泛型);
2、 泛型类(接口);
3、 泛型方法
具体性质如下:
一、 容器中使用泛型
作用:主要是用来指定容器中应该存放的数据类型,如ArrayList<String>arrraylist =new Arraylist<String>()表示arraylist中只能存放String类型的数据;Iterator<T>表示迭代时产生的元素的类型;comparable<T>用于对象间的比较,而一般只能与同类型对象进行比较,因此泛型中的类型为相容类型。
二、 泛型类与泛型接口
定义方式:class(interface)classname<T>{…..}
1、 泛型类
1) 使用泛型类:classname<具体类型> xxx=new classname<具体类型>();注意:在未具体化类型前,不能利用泛型类创建对象,只能创建引用(一般在泛型类内)。
2) 泛型类的继承:继承泛型类是时,一般要泛型具体化,若没有具体化就需要使用子类时将父类泛型具体化。
3) 转型:由于檫除,泛型不能显著地引用运行时类型的操作,例如转型,instanceof和new表达式。
特例:向上转型:回忆一下,在非参数化类型的继承中,可以实现子类向基类的向上转型,只要符合语法规则即可,基本形式:Baseb=new Descent()。
那么在泛型中能实现向上转型吗?总结起来有两种形式的:
(1)泛型类向上转型:
(2) public class Base<T>{
(3) T t;
(4) void set(T t){
(5) this.t=t;
(6) }
(7) T get(){
(8) return t;
(9) }
(10) void print(){
(11) System.out.print("ok!");
(12) }
(13) }
(14) import java.util.*;
(15) public class Descent<T> extends Base<T>{
(16) void print(){
(17) System.out.println("OK"+"haha");
(18) }
(19) public static void main(Stringarg[]){
(20) Base<Integer> b=new Descent<Integer>();
(21) // Descent<Double> s=newDescent<Double>();
(22) // Descent<Integer> a=newDescent<Integer>();
(23) // s=Descent<Double>(a);
(24) //泛型不能执行显示的转型,见java编程思想P403及P376
(25) b.print();
(26) }
(27) }
上面的程序没有什么特殊的含义,Base为基类,Descent为子类(导出类);在主函数中我们通过Base<Integer>b=new Descent<Integer>()实现了泛型类的向上转型,其实这种转型已经是在参数具体化之后的转型,原理上与非泛型类的一致。若直接使用未具体化的泛型类转型则会报错,这也符合前面转型开始时的论述。
(2)容器中泛型的向上转型:在容器中,泛型类型直接向上转型是不可以的,即List<Base>k=new ArrayList<Descent>()是错误的。这时候要实现转型有两种方法:一种是使用普通的通配符,即List<? extends Base>k=new ArrayList<Descent>(),但是这种方式实现的转型,不能对对象进行修饰,只能获得对象信息。另一种是使用超类型通配符,即List<? super Base>k=new ArrayList<Descent>(),这样转型不仅可以查看对象,还可以向容器中添加实例。
2、泛型接口
与泛型类类似,在实现接口的时候,要具体化泛型类型,并且实现相应的方法。
【注】:由于擦除的原因,一个类不能实现同一泛型接口的两种变体,因为由于擦除,编译器会认为是相同的接口(在泛型中,类型都被擦除为第一边界类型,默认情形下是Object)。
三、 泛型方法
定义方式:将泛型参数列表置于返回值类型之前,注意统一个功能既可以用泛型类实现,同时又可以用泛型方法实现,要首选泛型方法,原因有两个:(1)泛型方法的调用和普通方法类似(2)静态方法不可以使用泛型类的参数化类型只能,因此静态方法泛型化只能用泛型方法。
1、 泛型作为返回值类型
泛型作为返回值类型时,编译器会自动转型成与调用类型一致的参数类型。原理是:泛型的类型判断机制,但是这种类型判断机制只对赋值操作有效。
【注】这些总结是看过《java编程思想》泛型一章后的一些个人理解,有不对的地方欢迎大家指正,谢谢!