关于泛型的一些问题

泛型的作用

  1. 使用泛型的类可以适应更加广泛的类型,制作的工具类能够适配更多的类型。
  2. 在集合中使用泛型能够在编码阶段实现类型检查,防止类型转换错误。

泛型采用的方法:

	类型擦除

为什么使用类型擦除?

	为了向前兼容,兼容JDK1.5之前的Java类库。

泛型常见类型及解析(大多数使用在集合当中)

  1. 字母型(一般用在编写工具类或者接口中):
    List<E> 、Map<K,V>等英文字母,字母可以随意定。

常见的字母含义:
T Type表示类型
K V 分辨表示键值对中的key value
E 代表Element

public interface List<E> extends Collection<E>

public interface Map<K,V>

public class Child<E> { //可以在类名后面声明泛型
    public <T> E get(T type){//也可以在方法前面声明泛型
        return null;
    }
}
  1. 通配符类型(一般用在实例化泛型类的时候):
    List<?>
List<?> list = new ArrayList<>();
Apple apple = new Apple();
list.add(apple);//当使用通配符的List第一次放入Apple对象后,该List就会被确定为Apple类型
				//触发类型检查机制,后续只能存入Apple类型的对象,否则无法通过编译器编译
  1. 上界通配符<? extends A>和下界通配符<? super B>
class Fruit;
class Apple extends Fruit;

List<Apple> apples = new ArrayList<>();
List<Fruit> fruits = apples;//报错
List<? extends Fruit> fruits = apples;//编译通过

List<Fruit> fruits = new ArrayList<>();
List<Apple> apples = fruits;//报错
List<? super Apple> apples = fruits;//编译通过
<? extends A>可以将A的任一子类类型放入到集合中。
<? super B>可以将B的任一父类类型放入到集合中。

注意:

<? extends T>可以获取数据(get T类型),无法存储数据(add)。
<? super T>可以存储数据(add T及T的子类),无法获取数据(get)。

because:

<? extends Orange>可以确定Get到的一定是Orange类型及其子类,但是无法确定是Orange还是Orange的某个子类,所以不能Add;

<? super Orange>不能确定Get到的是Orange还是Orange的父类,只能用Object来接收,也就无法确定Get到的类型的方法,Get到的值无意义,但是可以Add元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值