public class Applicatioon {
public static void main(String[] args) {
Plate<? extends Fruit> plate1 = new Plate<>(new Apple());
/**
* “? extends Fruit”是上界通配符,表示 plate1 中的item存储的是Fruit及其子类类型(Fruit就是上界),但是无法确定到底是哪一个。
*
* # 由于知道plate1的item存储的肯定是Fruit或者其子类,所以可以get并转换成Fruit或者其超集(Fruit或者其子类 =get=> Fruit或者其超集)
*
* # 由于不知道plate1中的item到底存储的是Fruit或者其子类的哪一个,所以没办法set。
*/
// getter
Fruit fruit1 = plate1.getItem(); // 正确
Food food1 = plate1.getItem(); // 正确
Meat meat1 = plate1.getItem(); // 错误,Fruit不能转成Meat
//setter
plate1.setItem(new Apple()); // 错误
plate1.setItem(new Fruit()); // 错误,假设应该保存Fruit的子类如Apple,Fruit无法转换成Apple
plate1.setItem(new Food()); // 错误
plate1.setItem(new Object()); // 错误,假设应该保存的是Fruit,存入Object,Object无法转化成Fruit
// 所以set任何类型都有问题,既无法set
// 构造器
Plate<? extends Fruit> plate1_1 = new Plate<>(new Apple()); // 正确,因为构造器是“Plate(T item)”,然后“T extents Fruit”
Plate<? extends Fruit> plate1_2 = new Plate<>(new Fruit()); // 正确
Plate<? extends Fruit> plate1_3 = new Plate<>(new Food()); // 正确,因为构造器是“Plate(T item)”,然后“T extents Fruit”,T为Food不满足条件
/**
* "<? super Fruit>" 是下界通配符,表明plate2中的item存储的是Fruit自身或者其超类(Fruit就是下界),但是不能确定到底是哪一个。
*
* # 由于知道“item”中存储的肯定是Fruit或这其超类,所以set进去Fruit或者Fruit的子类(Fruit或者其子类 =set=> Fruit或者其超类)。
*
* # get的时候由于不能确定到底存储的是Fruit或者其超类的哪一个,所以get会出问题,但是所有的类都是Object的子类,所以返回Object没问题
*/
Plate<? super Fruit> plate2 = new Plate<>(new Fruit());
// setter
plate2.setItem(new Food()); // 错误,假设存储的是Fruit,Food没办法转成Fruit(下界)
plate2.setItem(new PinkLady()); // 正确
plate2.setItem(new Fruit()); // 正确
// getter
Fruit fruit2 = plate2.getItem(); // 错误
Food food2 = plate2.getItem(); // 错误
Object object = plate2.getItem(); // 正确
// 构造器
Plate<? super Fruit> plate2_1 = new Plate<>(new Food()); // 正确
Plate<? super Fruit> plate2_2 = new Plate<>(new Apple()); // 正确
Plate<? super Fruit> plate2_3 = new Plate<>(new Meat()); // 正确
List<? super Fruit> list = new ArrayList<>();
}
}
class Plate<T> {
private T item;
public Plate(T item) {
this.item = item;
}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
class Food {
}
class Meat extends Food {
}
class Fruit extends Food {
}
class Apple extends Fruit {
}
class PinkLady extends Apple {
}
java泛型-上界通配符<? extends XXX> 和下届通配符<? super XXX>
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 之前一直对Java泛型中的通配符不是很清楚,前几天专门研究了一下。Java中的泛型通配符分为以下三种: <? ex...
- 1. extends extends指上界通配符,示例中指的是所有Fruit类及其派生的子类。对该通配符指示的容器...
- 泛型 泛型就是类型参数化,处理的数据类型不是固定的,而是可以作为参数传入。泛型是计算机程序中一种重要的思维方式,它...
- 意义不同 ? extends T 表示上界是T ? super T 表示下界是T 用法不同 以List为例List...