范型
- 容器里装的东西之间有继承关系,但是容器之间没有继承关系,所以下列写法是错误的:
Plate<Fruit> fruitPlate = new Plate<Apple>(new Apple());
- 范型上界通配符<? extend A> 接收A类或者A的子类
- 特性:不能set(),只能get(),get()出来的东西只能放在A类或者A的基类里,例如
//fruitPlate表示能放一切水果的盘子
Plate<? extends Fruit> fruitPlate = new Plate<>(new Apple());
// 读取出来的东西只能放在Fruit或者它的基类里
Fruit fruit = fruitPlate.getItem();
Food food = fruitPlate.getItem();
- 范型下界通配符<? super A> 接收A类或者A类的父类
- 特性:可以set(),但是get()出来的东西只能放在Object对象里,例如
//fruitPlate表示能放Fruit以及Fruit基类的盘子
Plate<? super Fruit> fruitPlate= new Plate<>(new Food());
//Error
fruitPlate1.setItem(new Food());
fruitPlate.setItem(new Fruit());
fruitPlate.setItem(new Apple());
//读取出来的东西只能放在Object类里
Object object = fruitPlate.getItem()
- 通配符<?> 和类型参数<T>的区别就在于,对编译器来说所有的T都代表同一种类型,但是通配符没有这种约定。
- 总结
- 频繁读取的,适合通配符上界;
- 频繁插入的,适合通配符下界;