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>

  • 相关阅读:
    C语言 realloc为什么要有返回值,realloc返回值具体解释/(解决随意长度字符串输入问题)。
    opencv中的vs框架中的Blob Tracking Tests的中文注释。
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 棋盘多项式
    Java实现 蓝桥杯VIP 算法提高 分苹果
    Java实现 蓝桥杯VIP 算法提高 分苹果
    Java实现 蓝桥杯VIP 算法提高 分苹果
    Java实现 蓝桥杯VIP 算法提高 分苹果
  • 原文地址:https://www.cnblogs.com/cascle/p/7073688.html
Copyright © 2011-2022 走看看