文章结合知乎大佬的回答,结合自己的理解进行整理.但内容属于该作者. 原文链接: 点击跳转
<? extends T>
和 <? super T>
是Java泛型中的通配符和边界的概念.
<? extends T> : 是指 上界通配符
<? super T> : 是指 下届通配符
1. 为什么要用通配符和边界?
使用泛型的过程中,经常出现一种很别扭的情况.比如我们有Fruit
类,和它的派生类Apple
类.
class Fruit {
}
class Apple extends Fruit {
}
然后有一个最简单的容器: Plate类,盘子里可以放一个泛型的"东西".我们可以对这个东西做最简单的"放"和"取"的动作: set() 和 get() 方法.
class Plate<T> {
private T item;
public Plate(T t) {
item = t;
}
public void set(T t) {
item = t;
}
public T get() {
return item;
}
}
现定义一个"水果盘子",逻辑上水果盘子当然可以装苹果.
Plate<Fruit> p = new Plate<>(new Apple());
但实际上Java编译器不允许这个操作.会报错,“装苹果的盘子"无法转化为"装水果的盘子”.
这个不符合正常的逻辑呀.
但编译器认定的逻辑是这样的:
苹果 IS-A