Android基础难点-泛型

泛型上下限的读写模式是什么(或者泛型的PECS模式)

PECS指的是Producer Extends, Consumer Super(生产者扩展,消费者超级),一般的解释是读取时使用extends,写入时使用super,但是并不准确。
? super Apple 不是说 只接受Fruit和Fruit的父类, 而是说这个类型T可能是Fruit及其父类中的一种,也就是是说,可能是苹果或者水果,随便一个苹果肯定属于T,所以能放进去,红富士也是苹果或者水果,所以也能放进去,但是如果我们试图放入一个超类的时候,就不可以了,也就是super可读可写,但是只能写入子类,并且读取时需要强转,因为不知道放入的是红富士还是蛇果。
? extends Apple,是说类型T可能是Apple及其子类中的一种,意味着T可能是苹果,也可能是红富士苹果。当T为红富士时,蛇果进去肯定不对,因为这个苹果不一定是红富士,也可能是别的品种的苹果,为了避免出现这样的问题,所以就干脆不可写,所以extend是可读不可写。(这段非常重要)

代码示例extend

ArrayList list = new ArrayList<>();
list.add(new String());
list.add(new String());
String s = list.get(0);

代码示例super

ArrayList list = new ArrayList<>();
list.add(new HoFuShi());
list.add(new Apple());
// 这里会报错
list.add(new Fruit());
Object o = list.get(0);
String s = (String) list.get(1);

所以PECS原则,应该是说只是推荐这样使用而不是super只能存不能取

?限定符是什么

是和String、Object同级别的类,用于泛型实例化的时候使用,这里需要注意,是泛型实例化的时候使用,而不是类实例化的时候使用
使用?限定符实例化泛型的类,在类本身实例化,也就是new的时候,可以选择随意的类作为?符号的填充
ArrayList a = new ArrayList();

泛型擦除是什么

1、编译时,在字节码层面,所有的尖括号都会被擦除,参数的T变成Object,有上下界的会变成上下界类
2、会在字节码保留泛型类型
3、使用时也就是运行到这段字节码的时候,再将Object强制转换成对应类型

为什么要有泛型擦除

为了兼容没有泛型的java版本
让没有泛型的.class文件在新的虚拟机也能用

泛型为什么不能声明在泛型类里面的静态方法和静态变量中

泛型类里面的静态方法和静态变量可能比构造方法先执行,导致泛型没有实例化就调用
背景知识:静态方法和静态变量是在类初始化的时候就加载的
但是可以在普通类里面的静态方法中使用泛型,因为方法调用的时候就

你可能感兴趣的:(Android基础难点-泛型)