Java泛型总结

总结一:泛型总结

泛型的理解应建立在泛型应用的场景中,泛型的应用场景总结起来有以下集中:

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编程思想》泛型一章后的一些个人理解,有不对的地方欢迎大家指正,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值