zoukankan      html  css  js  c++  java
  • 泛型!擦除与转换!

    在严格的泛型代码里,带泛型声明的类总是应该带着类型参数,但为了与老的java代码保持一致,也允许在使用带泛型声明的类时不指定类型参数。如果没有为这个泛型类指定类型参数,则该类型参数被称作一个raw type(原始类型),默认是声明该参数时指定的第一个上限类型。 当把一个具有泛型信息的对象赋给另一个没有泛型信息的对象时,则所有在<>之间的类型信息都被扔掉了。比如说一个List<String>类型被转换为List,则该List对集合元素的类型检查变成了类型变量的上限(即Object)。

    class Demo<T extends Number>
    {
    T size;
    public Demo(){}
    public Demo(T size)
    {
    this.size = size;
    }
    public void setT(T size)
    {
    this.size = size;
    }
    public T getSize()
    {
    return this.size;
    }
    }

    class TestEraser
    {
    public static void main(String[] args)
    {
    //method1();
    method2();
    //method3();
    }
    
    /**
    把一个d赋给不带泛型信息的d2变量时,编译器会流失d对象的泛型信息,但因为Demo类型的参数类型上限是Number类,
    所以编译器依然知道d2.getSize()的返回值类型是Number类型。
    */
    public static void method1()
    {
    Demo<Integer> d = new Demo<>(6);
    Integer id = d.getSize();
    
    Demo d2 = d; //把d对象赋给Demo类型的变量,会丢失泛型信息
    
    //Integer id2 = d2.getSize(); //编译错误
    Number id2 = d2.getSize();
    
    }
    
    /**
    下面程序中定义了一个List<Integer>对象,当把对象li赋给一个不带泛型的List变量list后,编译器
    就会流失前者的泛型信息,这就是擦除。但java允许直接把List对象赋给一个List<Type>(Type可以是
    任何类型)的变量。
    从逻辑上看,List<String> 是list的子类,如果直接把一个List对象赋给一个List<String>对象
    将引发编译错误,但对于泛型而言,可以直接把一个List对象赋给一个List<String>对象,编译器
    仅仅提示“未经检查的转换”,但要访问List<String>对象中的元素将会引发ClassCastException异常
    
    */
    public static void method2()
    {
    List<Integer> li = new ArrayList<>();
    li.add(6);
    li.add(9);
    List list = li;
    List<String> ls = list; //警告,编译运行完全正常
    //但要访问ls集合里的元素,将会引起运行时异常
    System.out.println(ls.get(0)); 
    
    }
    /**
    method2代码虽然可以编译通过,但实际上对list变量实际上引用的是List<Integer>集合,所以当试图
    把集合里的元素当成String类型的对象取出时,将引发ClassCastException类型转换异常,上面的代码
    可以转换成下面的代码就好理解了。
    */
    
    public static void method3()
    {
    List li = new ArrayList();
    li.add(6);
    li.add(9);
    //运行异常
    System.out.println((String)li.get(0)); 
    }
    }

  • 相关阅读:
    [模板] 文艺平衡树
    [模板]平衡树splay
    [ZJOI2015]诸神眷顾的幻想乡
    [HAOI2016]找相同字符
    SP8093 JZPGYZ
    SP1812 LCS2
    SP1811 LCS
    AHOI2013 差异
    TJOI2015 弦论
    工艺(SAM)
  • 原文地址:https://www.cnblogs.com/yangzhi/p/3576635.html
Copyright © 2011-2022 走看看