• Java中的泛型


    1.术语介绍

    参数化的类型 List<String>
    实际类型参数 String
    泛型 List<E>
    形式类型参数 E
    无限制通配符类型 List<?>
    原生态类型 List
    有限制类型参数 <E extends Number>
    递归类型限制 <T extends Comparable>
    有限制通配符类型 List<? extends Number>
    泛型方法 static <E> List<E> asList(E[] a)
    类型令牌 String.class
       

    2.为什么使用泛型而不要使用原生态类型

    • 直接地说,不使用泛型会出现运行时异常,而使用泛型,有问题编译时就会被编译器发现。
    • Java1.5版本之前,没有泛型,从集合中读取的每一个对象都必须进行转换
    • 如果一不小心插入了类型错误的对象,编译时不会被发现,运行时转换会出错
    //使用泛型,告诉编译器list1里只能放入String类型
    List<String> list1 = new ArrayList<>();
    list1.add(new String("abc"));//不报错
    list1.add(new Integer(1));//编译器报错,编译不通过
    
    //使用原生态类型,
    List list2 = new ArrayList();
    list2.add(new String("abc"));//不报错
    list2.add(new Integer(1));//不报错

    如果你使用了泛型,就等于告诉编译器,我这个集合就放这种类型,你给我盯着点,如果我忘了,往里面添加别的类型你要阻止我!

    一句话,可以让编译器帮你检查类型错误。

    因此,我们声明集合时要尽量使用泛型,能最大地减少类型错误。(新写的代码都要用泛型)

    那么为什么编译器不强制我们使用泛型呢?原因是,泛型是jdk1.5才提出来的,允许原生态和泛型并存只是为了兼容引入泛型之前的代码,毕竟到jdk1.5时已经有很多项目在使用Java了。

     

    3.有哪些地方必须使用原生态呢

    • 在类类型中必须使用原生态
      • List<String.class>、List<?>.class,都是不合法的;List.class、String[].class、int.class,是合法的
    • 关键字 instanceof
      • o instanceof Set 合法;

     总之,使用原生态类型在运行时会导致异常,因此在新代码中要使用泛型

    4.消除非受检警告 

    消除所有警告,就可以确保代码是类型安全的,意味着运行时不会出现ClassCastException。

    # 会有警告
    List<Monkey> monkeys1 = new ArrayList();
    
    # 消除警告
    List<Monkey> monkeys2 = new ArrayList<Monkey>();
    #或者如下
    List<Monkey> monkeys3 = new ArrayList<>();
    • 如果无法消除警告,同时可以证明引起警告的代码是类型安全的,可以用 @SuppressWarning("unchecked") 注解来禁止这条警告

    但是请不要随便用,你确保真的没有类型安全问题时才用,不然运行时还是会报错;

    如果你忽略警告,也不检查类型问题也不加注解,那么新出现的警告就会淹没在众多错误警告中

    • SuppressWarning 可以用在任何力度的级别中,从局部变量到整个类,但你应该尽量用在可能小的范围内
  • 相关阅读:
    Win10 字体模糊解决(DPI缩放禁用),设置默认输入法英文
    windows下使用VS2015编译V8 JavaScript引擎(v5.5
    GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断
    wget 显示"英国中部时间",去掉烦人的刷屏显示
    阻止事件冒泡,阻止默认事件,event.stopPropagation()和event.preventDefault(),return false的区别
    CSS
    bootstrap4 调整元素之间距离
    数据库文件结构、sqlserver ON [PRIMARY]
    快速查看数据库中每个表的数据条数
    关于LINQ中SELECT NEW 的问题
  • 原文地址:https://www.cnblogs.com/shog808/p/15916840.html
Copyright © 2020-2023  润新知