请不要在新代码中使用原生类型(23)

一、声明中具备一个或多个类型参数的类或接口叫作泛型类、泛型接口(统称泛型)java

  • List
  • 每组泛型定义一组参数化的类型

二、每种泛型都带一个原声态类型安全

  • 即不带任何实际类型参数的泛型名称
  • List 的原声态类型是 List
  • 以下就是一个原生集合

  • 未做限制,集合里面什么都能更加
  • 编译期不会报错,运行下述代码才会报错
  • 后续提取使用,类型转换会有问题

  • 在声明集合时限定死

  • 这样以下编译期就会报错

三、不提供类型参数,使用集合类型和其余泛型也仍然合法code

  • 这样会失掉安全性和表述性全部优点
  • java 容许这样作是为了和以前代码保持兼容性!

四、List是被容许的对象

  • List 和List区别在于:前者逃避了泛型检查;后者明确告诉编译器,他能够持有任何类型

五、泛型子类型化规则blog

  • List 是List 的子类型,和List不是一个类型
  • List 会失去安全性,List不会
  • 以下,能够进行编译,编译时会有一条警告(请不要忽视)

六、无限制通配符类型接口

  • Set的无限制通配符类型为:Set(某个类型的集合)
  • 无限定通配符在建立对象,建立泛型类、接口、方法都不能使用
  • 常常和限定通配符extends,super一块儿使用
List<?> list2 = new ArrayList<String>();  
        // 只能增长null  ,不能插别的任何元素
        list2.add(null);  
        test(list2);

七、本条的两个例外:编译器

类文字中必须使用原生态类型编译

  • 好比 List.class 、String[].class、int.class
  • 不可使用:List<String.class>、List<?>.class
  • 因为泛型在运行时会被擦除

参数化类型而非无限制通配符上使用instanceOf 都是非法的class

  • 无限制通配符上可使用instanceOf ,效果和原生态类型同样的

八、总结test

  • 不要在新代码中使用原生态类型
  • 原生态代码仅仅是为了与引入泛型以前代码兼容和互用提供的
  • Set<Object>是参数化类型,包含任何对象的一个集合(安全)
  • Set<?>通配符类型,只包含某种未知对象的集合(安全)
  • Set 原生态类型,脱离了泛型(不安全)

相关文章
相关标签/搜索