问题描述
importjava.util.LinkedList;publicclassTest{publicstaticvoidmain(String[]args){LinkedList<?extendsA>list=null;list=newLinkedList<B>();list=newLinkedList<C>();list.add(newC(12));//报错}}abstractclassA{publicA(){}publicabstractintget();publicabstractvoidset(intnum);}classBextendsA{privateintb;publicB(intnum){b=num;}publicintget(){returnb;}publicvoidset(intnum){this.b=num;}}classCextendsA{privateintc;publicC(intnum){c=num;}publicintget(){returnc;}publicvoidset(intnum){this.c=num;}}------------------------------------------报错类型LinkedList<capture#3-of?extendsA>中的方法add(capture#3-of?extendsA)对于参数(C)不适用请问有谁知道为什么会出错?
解决方案
解决方案二:
//对象可以使用父类引用指向子类对象,集合不可以,泛型必须精确类型//把LinkedList<?extendsA>list改为LinkedList<C>listLinkedList<C>list=null;//LinkedList<?extendsA>list=null;list=newLinkedList<C>();list.add(newC(12));
解决方案三:
谢谢回复也就是说如果不使用泛型集合类例如MyClass<?extendsA>myClass=null;myClass=newMyClass<C>();myClass.add(newC(12));就没问题咯?
解决方案四:
LinkedList<?extendsA>list=null;这句话表明list中存的是A的子类,但这种描述是模糊的,不能确定到底是哪个子类,可能是B,也可能是C,所有编译器只允许list.add(null).因为null是所有类的子类。不过可以将extends改成super,这样上面就不会报错了,因为LinkedList<?superA>list=null;表明?是A的父类,那么不论是B还是C必然都是?的子类,故不报错。建议楼主去研究下上下边界通配符类型的get,set使用。附:当使用get方法时,尽量用上边界限定通配符当使用set或add方法时,尽量使用下边界限定通配符