错误原因
引发异常的原因是因为Collection< ParentClass>可以有任何扩展ParentClass添加到它的对象.例如,可以向其添加以下类的实例
public class OtherChildClass extends ParentClass{
}
但是因为“真实”集合是Collection< ChildClass>这会引起错误.或者即使您向其添加了ParentClass,也会引发错误.总而言之不好.
解
然而,这可以通过使用Collection< ;?来解决.扩展ParentClass>在你的类型声明中.这意味着您将返回一个声明为包含某些类的Collection,该类可以转换为ParentClass并称为逆变.这样的集合不能添加新对象(允许的null异常),因为编译器永远不能保证您尝试放入它的内容是有效的.但它可以保证从它出来的任何东西都可以转换为ParentClass并且可以这样使用.见here for more details.用法示例如下:
import java.util.ArrayList;
import java.util.Collection;
public class TestClass {
public static int PARENTTYPE=0;
public static int CHILDTYPE=1;
ArrayList parentHolder=new ArrayList();
ArrayList childHolder=new ArrayList();
public TestClass(){
parentHolder.add(new ParentClass());
childHolder.add(new ChildClass());
}
public ArrayList extends ParentClass> getHolder(int type){
if (type==PARENTTYPE){
return parentHolder;
}else if (type==CHILDTYPE){
return childHolder; //
}else{
throw new RuntimeException("Not a valid type");
}
}
public static void main(String args[]){
TestClass test=new TestClass();
ArrayList extends ParentClass> col1=test.getHolder(PARENTTYPE);
ArrayList extends ParentClass> col2=test.getHolder(CHILDTYPE);
ParentClass childCastToParent=col2.get(0);
}
}
注: arraylists已被用于简洁,但同样适用于所有集合