// 对象可以使用父类引用指向子类对象,集合不可以,泛型必须精确类型 // 把 LinkedList<? extends A> list 改为 LinkedList<C> list LinkedList<C> list = null; // LinkedList<? extends A> list = null; list = new LinkedList<C>(); list.add(new C(12));
谢谢 回复也就是说 如果不使用 泛型集合类 例如 MyClass<? extends A> myClass = null; myClass = new MyClass<C>(); myClass.add(new C(12)); 就没问题咯?
LinkedList<? extends A> list = null; 这句话表明list中存的是A的子类,但这种描述是模糊的,不能确定到底是哪个子类,可能是B,也可能是C,所有编译器只允许list.add(null).因为null是所有类的子类。 不过可以将extends改成super,这样上面就不会报错了,因为LinkedList<? superA> list = null;表明?是A的父类,那么不论是B还是C必然都是?的子类,故不报错。 建议楼主去研究下上下边界通配符类型 的get,set使用。 附: 当使用get方法时,尽量用上边界限定通配符当使用set或add方法时,尽量使用下边界限定通配符
// 把 LinkedList<? extends A> list 改为 LinkedList<C> list
LinkedList<C> list = null; // LinkedList<? extends A> list = null;
list = new LinkedList<C>();
list.add(new C(12));
myClass.add(new C(12)); 就没问题咯?
这句话表明list中存的是A的子类,但这种描述是模糊的,不能确定到底是哪个子类,可能是B,也可能是C,所有编译器只允许list.add(null).因为null是所有类的子类。
不过可以将extends改成super,这样上面就不会报错了,因为LinkedList<? superA> list = null;表明?是A的父类,那么不论是B还是C必然都是?的子类,故不报错。
建议楼主去研究下上下边界通配符类型 的get,set使用。
附:
当使用get方法时,尽量用上边界限定通配符当使用set或add方法时,尽量使用下边界限定通配符