泛型中 extends 和 super 的区别? <? extends T> 和 <? super T> 是Java泛型中的“通配符(Wildcards)”和“边界(Bounds)”的概念 <? extends T> :是指 上界通配符(Upper Bounds Wildcards) <? super T> :是指 下界通配符(Lower Bounds Wildcards) 为什么要用通配符和边界? 使用泛型的过程中,经常出现一种很别扭的情况。比如按照题主的例子,我们有Fruit类,和它的派生类Apple类。 class Fruit {} class Apple extends Fruit {} 然后有一个最简单的容器:Plate类。盘子里可以放一个泛型的“东西”。我们可以对这个东西做最简单的“放”和“取”的动作:set( )和get( )方法。 public 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; } } 现在我定义一个“水果盘子”,逻辑上水果盘子当然可以装苹果。 Plate< Fruit > plate = new Plate< Apple > ( new Apple ()); 但实际上Java编译器不允许这个操作。会报错,“装苹果的盘子”无法转换成“装水果的盘子”。 error: incompatible types: Plate<Apple> cannot be converted to Plate<Fruit> 所以我的尴尬症就犯了。实际上,编译器脑袋里认定的逻辑是这样的: 苹果 IS-A 水果 装苹果的盘子 NOT-IS-A 装水果的盘子 所以,就算容器里装的东西之间有继承关系,但容...