假设有3个类,他们的关系如下:
class Fruit {}
class Apple extends Fruit {}
class Jonathan extends Apple{}
? extend Fruit 表示泛型变量:该泛型变量是一个未知类型,只知道这个变量是继承自Fruit类型或者是Fruit类型
所以泛型变量“ ? extend Fruit”不接受任何一种类型给他赋值
List<? extends Fruit> list1 = new ArrayList<Apple>();//Apple可以替换成Fruit,Jonathan
list1.add(new Apple());// error 因为需要传递一个“继承自Fruit”的类型,但不知道实际类型(实际类型有可能是Fruit类型或Fruit的子类型),所以不对
list1.add(new Fruit());// error,同样的不知道应该接受一个怎样的实际类型
list1.add(new Jonathan());// error,同样不对
list1.add(new Object());// error,Object不继承Fruit
但是知道泛型变量是继承Fruit类型的,所以该泛型变量可以赋值给Fruit类型的变量
Fruit f = list1.get(0);// ok,因为“? extends Fruit”泛型变量是继承自Fruit的,所以它也是一个Fruit类型
可以用变量来做一个说明,假设有下面几个变量:
Object object;
Fruit fruit;
Apple apple;
Jonathan jonathan;
可以这样理解泛型变量“ ? extend Fruit” A,则A是Fruit、Apple、Jonathan类型中的某个类型
则赋值语句A=apple;错误,因为变量A可能是Jonathan类型,apple变量不能赋值给Jonathan类型的变量
A=object;A=fruit;同样也是不行的。所以任意一个类型都不能赋值给A变量。
但是反过来,因为知道A是继承自Fruit类型的,所以下面赋值语句是可以的
fruit = A; //ok, 因为apple、fruit、jonathan类型的变量都可以赋值给fruit类型
apple=A;//错误,因为A有可能是Jonathan类型,而Jonathan类型的变量A不能赋值给Apple类型的变量apple
? super Apple 表示泛型变量:该泛型变量是一个未知类型,只知道这个变量是Apple的父类型或Apple类型
所以泛型变量“? super Apple”不能赋值给任何变量(Object类型除外,Object是任意对象的父类是毫无疑问的)
List<? super Apple> list2 = new ArrayList<Fruit>();//Fruit可以改成Apple,Object
Fruit f = list2.get(0);// error 因为泛型变量“? super Apple”有可能是Apple类型、或Apple的父类Fruit、Object类型,所以不能赋值给Fruit类型的变量
Apple a = list2.get(0);// error 同上
Jonathan j = list2.get(0);//error 同上
Object o = list2.get(0);//ok Object是任意类型的父类。
但是知道泛型变量是Apple的父类型,所以Apple类型、Apple的子类型可以赋值给该变量。
注意泛型变量“? super Apple”是一个变量,就跟Apple a = new Apple();中的a变量一样的“变量”
list2.add(new Apple());// ok,add方法的参数变量是一个Apple类型或Apple的父类型,所以可以把Apple对象赋值给它
list2.add(new Fruit());// error
list2.add(new Jonathan());// ok
可以用变量来做一个说明,假设有下面几个变量:
Object object;
Fruit fruit;
Apple apple;
Jonathan jonathan;
可以这样理解泛型变量"? super Apple" A,则A是Object、Fruit、Apple类型中的某个类型
则赋值语句 A=apple;A=jonathan可以。
但是赋值A=fruit;错误,因为A可能是Apple类型,而fruit变量不能赋值给Apple类型的变量
赋值A=object也是错的。
同样,反过来更明显了,fruit=A;apple=A这样赋值不行,因为A可能是Object类型
}