泛型的好处就是:
1、适用于多种数据类型执行相同的代码
2、泛型中的类型在使用时指定,不需要强制类型转换
泛型:参数化类型
泛型类、泛型接口、泛型方法【必须带<T>,不带则是普通类、接口、方法】
泛型方法可以与外部的泛型类用相同的泛型符号,传入参数以泛型方法为准
extends :派生、继承。用于限定类型变量
?:通配符,由于泛型编码后传入对象转为Object类
? extends A:【用于安全访问,限定了上界】,传入的通配符派生于A【包括A本身】,泛型方法中使用?,泛型类要指明。 类型上限为A,即传入类型最高父类为A,传入A的父类会报错。【取出转为A】
? super A:【用于安全写入,限定了下界】,传入的对向为A的父类【包括A本身】,类型下限为A,传入A的子类会报错。【存入转为A】
<? extends T>【取出安全】
代表传入的泛型类型为 T 或 T 的子类。【上界为T,下界未知】
传入的对象都会转为T,安全取出的话只能以类型T来接受,要取出想要的类型需要强转。
修改时候,由于只接受<? extends T>参数这种未知类型,由于这个类型往下是无穷多类型的子类,jvm没法确定传参是谁,所以无法修改。
总结:主要用于安全地访问数据,可以访问X及其子类型,并且不能写入非null的数据。
<? super T>【存储安全】
代表传入的泛型类型为T或T的超类。【下界为T,上界理解为Object】
传入的对象如果为T的子类,则会转为T类型对象存放。
取出时候,由于不知道上界,所以会以Object对象取出。
总结 ? extends 和 ? super 通配符的特征,我们可以得出以下结论:
◆ 如果你想从一个数据类型里获取数据,使用 ? extends 通配符(能取不能存)
◆ 如果你想把对象写入一个数据结构里,使用 ? super 通配符(能存不能取)
◆ 如果你既想存,又想取,那就别用通配符