泛型

来源:互联网 发布:智百威软件800 编辑:程序博客网 时间:2024/05/27 00:45
  • 1.简介:
    • 1)泛型可以解决数据类型的安全问题,主要原理是在类声明的时候通过标识,表示类中某个属性类型或是某个方法的返回值及参数类型。这样在类的声明及实例化的时候只要指定好需要放入类型即可。
    • 2)
//泛型类的声明 class ZuoBiao<T> {//此处可以随便写标识符号,T是type的简称,有意义     private T var;//var的类型由外部指定,即由T指定     public T getVar() {        return var;//返回值类型由外部决定     }    public void setVar(T var) {//设置类型由外部决定         this.var = var;    } public class FanXingDemo {    /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub         ZuoBiao<String> p = new ZuoBiao<String>();// 里面的var类型为String         p.setVar("泛型---字符串");        System.out.println("获取泛型内容-----" + p.getVar().length()                + "-----得到字符串的长度");        ZuoBiao<Integer> p1 = new ZuoBiao<Integer>();        p1.setVar(120);        System.out.println("获取泛型内容-----" + p1.getVar() + "------得到整型数据");        ZuoBiao<Float> p2 = new ZuoBiao<Float>();        p2.setVar(13.24f);        System.out.println("获取泛型内容-----" + p2.getVar() + "------得到浮点型数据");    }} 构造方法中使用泛型:public ZuoBiao(T var) {//泛型的构造方法 super(); this.var = var; } 比如:ZuoBiao<String> pBiao = new ZuoBiao<String>("海源溪"); 以上是泛型指定单个类型时的定义格式及泛型的构造方法,如下为泛型指定多个类型的定义实例:如下为泛型指定多个类型的定义实例://泛型类的声明 class ZuoBiao<K,V> {//此处可以随便写标识符号,<>里放入多个类型,此时为2个类型,以“逗号”隔开     private K key;    public V velue;    public K getKey() {        return key;    }    public void setKey(K key) {        this.key = key;    }    public V getVelue() {        return velue;    }    public void setVelue(V velue) {        this.velue = velue;    }} public class FanXingDemo {    /**     * @param args     */    public static void main(String[] args) {        ZuoBiao<String, Integer> p = new ZuoBiao<String, Integer>();        p.setKey("字符串类型的数据");        p.setVelue(123);        System.out.println("泛型的多类型定义实例-----"+p.getKey());        System.out.print("泛型的多类型定义实例-----"+p.getVelue());    }} 

在泛型应用中,最好在泛型声明时指定好泛型的数据类型。
如果在声明时没有指定泛型类型,则程序会自动将类型指定为Object类型。

    • **3) **Java泛型(generics)允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用时用具体的类型来替换。
      4) 泛型最主要的应用是在新集合类框架中
      5) 的对象作为实际参数传进去,却发现无法通过编译。虽然从直觉上来说,Object是String的父类,这种类型转换应该是合理的。但是实际上这会产生隐含的类型转换问题,因此编译器直接就禁止这样的行为。
      6) 类型擦除(type erasure): Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为类型擦除。如在代码中定义的List和List等类型,在编译之后都会变成List。JVM看到的只是List,而由泛型附加的类型信息对JVM来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法避免在运行时刻出现类型转换异常的情况。
      7) 泛型类并没有自己独有的Class类对象。比如并不存在List.class或是List.class,而只有List.class。
      8) 泛型的类型参数不能用在Java异常处理的catch语句中。因为异常处理是由JVM在运行时刻来进行的。由于类型信息被擦除,JVM是无法区分两个异常类型MyException和MyException的。对于JVM来说,它们都是 MyException类型的。也就无法执行与异常对应的catch语句。
      9) 类型擦除过程:首先是找到用来替换类型参数的具体类。这个具体类一般是Object。如果指定了类型参数的上界的话,则使用这个上界。把代码中的类型参数都替换成具体的类。同时去掉出现的类型声明,即去掉<>的内容。比如T get()方法声明就变成了Object get();
      10) List就变成了List。接下来就可能需要生成一些桥接方法(bridge method)。这是由于擦除了类型之后的类可能缺少某些必须的方法
      11) 编译器承担了全部的类型检查工作
0 0
原创粉丝点击