zoukankan      html  css  js  c++  java
  • Java泛型与集合笔记

    第一章

    Java的泛型为了兼容性和防止代码爆炸,在编译成字节碼时会进行类型擦除,编译器自动添加代码做类型转换(用到List<Integer>的地方用Integer来做转换),自动做装箱拆箱,做foreach替换,在多个参数的情况下自动打包进一个数组里

    泛型的T一个是定义,是个是使用。使用的时候会包含定义。尖括号里可以使用通配符,编译器的类型转换只对尖括号里起作用

    第二章 子类和通配符

    2.1

    子类型替换原则:赋值里,等号右边可以使用父类型值的地方,用可以用子类的对象地址值替换。

    List<Integer>不是List<Number>的一个子类,二者也不想等,不可以直接赋值;List<Number>是Collection<Number>的一个子类,看尖括号之外的,不看里边的,编译器看到的是外边的继承关系。尖括号里边的一点意义都没有,因为这里不是主体,外边操作的不是他的方法。List<Integer>也不是Collection<Number>的子类

    通配符用在尖括号引入subtype的地方,来规避上边的限制

     2.2

    List<Integer>是Collection<? extend Number>的子类。通配符在这里起了作用,会把要操作的泛型先转换为Number来处理

    extend只能get和用在变量生命处,下边的代码错误是因为nums的项为(Integer)nums[i],而3.14转化为Number,父类不能赋给子类

    1 List<Integer> ints = new ArrayList<Integer>();
    2 ints.add(1);
    3 ints.add(2);
    4 List<? extends Number> nums = ints;
    5 nums.add(3.14); // compile-time error
    6 assert ints.toString().equals("[1, 2, 3.14]"); // uh oh!

    2.3

    List<Object>是List<? super Number>的子类,用父类的地方可以用子类代替

    2.4

    null不受put原理影响,null是所有类的子类;object不受get原理影响

    2.5

    使用带星号的List泛型替代Array,可以在编译的时候检查到违法赋值

    Array不能用super关键字 (? super Integer)[]  

    2.6

     Collection<?> 等价于 Collection<? extends Object> 

    ?可以适用于任何类型

    type parameter ( Collection<? extends E> c )只针对基类及其子类类型有效

    2.7

    两个?的容器不能互相赋值,因为无法确定下来类型

    2.8

    ?有三个地方不能用,分别是顶层new,泛型方法显示传参,extend和implements的父类不能是?,

    第三章 比较和边界

     3.1

    Comparator是一个包含compareTo方法的接口

    1 interface Comparable<T> {
    2 public int compareTo(T o);
    3 }

    compareTo应该和equal同步

    null导致comparteTo抛异常,在被比较值不为null的情况下

    compareTo用于与自然顺序逻辑不同的比较中

    3.2

    函数声明中尖括号里是类型边界,只能使用extend关键字

    这二者等价

    <T extends Comparable<T>> T max(Collection<T> coll)
    1 <T extends Comparable<? super T>> T max(Collection<? extends T> coll)

    3.3

    Comparable接口在不同类的层级实现,可以比较的对象不同。在基类实现,则所有子类可以混合比较

    3.4

    Comparator接口是比较器,用来实现不同于Comparable接口的逻辑,有两个接口

    1 interface Comparator<T> {
    2 public int compare(T o1, T o2);
    3 public boolean equals(Object obj);
    4 }

    3.5

    枚举原型是 public abstract class Enum<E extends Enum<E>> implements Comparable<E> ,子类是 final class Season extends Enum<Season> 

    3.6

    泛型可以有多个边界限制,用&分隔

    3.7

    负责做类型擦除(转换)提供一致接口自动生成的代码叫做桥,桥覆盖父类或者接口里的方法保证编译正确,会调用使用真正泛型参数的代码。方法签名里有bridge关键字

    3.8 协议覆盖

    如果一个方法的参数和父类的相同,返回值是父类方法返回值的子类,那么自动override,不用转换一次了。运用的就是brigde技术,自动生成一个桥方法简单调用覆盖的实现方法

    第四章 声明

     4.1

    final class Season extends Enum<Season>

  • 相关阅读:
    SonarQube+Jenkins代码审查集成CI/CD
    “拒绝了对对象'aspnet_CheckSchemaVersion'的 EXECUTE 权限”之解决
    ORA-31687: error creating worker process with worker id 1
    Oracle修改表列长度
    RouYi(Export excel)
    Spring事务失效的原因
    Linux/Keychron键盘 功能键F1-F12映射修复
    git 推送本地文件到远程仓库
    git remote 删除已添加的远程仓库地址
    mssql新建数据库
  • 原文地址:https://www.cnblogs.com/cascle/p/7073688.html
Copyright © 2011-2022 走看看