class Fruit{}
class Apple extends Fruit{}
在Thinking in java这本书的泛型那一章中有这样一个问题,ArrayList类中有一个add()函数,书中说当你指定一个ArrayList<? extends Fruit>时,add()的参数就变成了"? extends Fruit",因此它不会接受任何类型的Fruit。
但是在随后的一节中有这样一个类
class CovariantReader<T>{
T readCovariant(List<? extends T> list){
return list.get(0);
}
}
这个类可以却可以这样CovariantRearer<Fruit> fruit = new CovariantRearer<Fruit>() Fruit a = fruit.readCovariant(Arrays.asList(new Apple())) //可以运行
逻辑上好像是对的,但是总感觉和上面所讲的矛盾,不应该能接受List<Apple>
class A{
}
class B extends A{
}
List list = new ArrayList();
list.add(new B());
为ä»ä¹ä¸è½ålistä¸æ·»å ä»»ä½å¯¹è±¡äºå¢ï¼è¿Objectä¹ä¸è¡,è¿æ¯ä¸ºä»ä¹å¢ï¼è·ä¸é¢çä¾åæä»ä¹ä¸ååï¼addæ¹æ³çåæ°æ¯? extends A
è¿æ ·åå°±åªè½æ·»å A对象æè æ¯A对象çåé对象ï¼ï¼ä½ é£ä¸ªObjectæ¯Açç¶é对象ï¼å½ç¶å°±ä¸è½æ·»å äºï¼è¿å°±æ¯æ³åçä½ç¨åã说äºè¿ä¸ªè¯å¥List list = new ArrayList();åè¿ä¸ªè¯å¥List list = new ArrayList();æ¯ä¸æ ·çï¼è¿ä¸ªå·²ç»å£°æäºlistä¸åªè½åæ¾A对象ï¼
。。。。。List不是List的子类,协变性问题,你可以去看看
追答List不是List的子类,是的,可是list里面装的对象,是什么关系呀?Apple是Fruit的子类!list定义成父类或父接口,添加继承或实现接口的类的对象可以装进去并不暴异常不.fruit.readCovariant(Arrays.asList(new Apple())) 传入这个方法的时候他会自动判断Apple类是否继承Fruit类,是Fruit类的子类大的包容小的,拆箱装箱操作,但是你放在进去的对象不是Fruit的子类的时候报错了!