gpt4 book ai didi

java - 从指定返回 Collection 的方法返回 Collection

转载 作者:行者123 更新时间:2023-12-01 18:46:50 27 4
gpt4 key购买 nike

我正在尝试编写一个方法,该方法将返回一个集合(例如Arraylist),该集合使用泛型声明为包含父类或扩展父类的类。对于此方法,集合中的对象将始终用作父类的实例,但在其他上下文中,它们的使用方式不同,因此它们被单独保存。例如:

import java.util.ArrayList;
import java.util.Collection;

public class TestClass {

public static int PARENTTYPE=0;
public static int CHILDTYPE=1;

Collection<ParentClass> parentHolder=new ArrayList<ParentClass>();
Collection<ChildClass> childHolder=new ArrayList<ChildClass>();

public TestClass(){

}

public Collection<ParentClass> getHolder(int type){
if (type==PARENTTYPE){
return parentHolder;
}else if (type==CHILDTYPE){
return childHolder; //<--incompatible types
}else{
throw new RuntimeException("Not a valid type");
}
}

public static void main(String args[]){
TestClass test=new TestClass();

Collection<ParentClass> col1=test.getHolder(PARENTTYPE);
Collection<ParentClass> col2=test.getHolder(CHILDTYPE);
}
}


public class ParentClass {
}


public class ChildClass extends ParentClass{
}

但是我在指定的行收到不兼容类型的异常。如何编写该方法,以便可以返回声明为包含扩展某个类的任何对象的集合。

最佳答案

错误原因
引发异常的原因是 Collection<ParentClass>可以有任何扩展 ParentClass 的对象添加到其中。例如,可以向其中添加以下类的实例

public class OtherChildClass extends ParentClass{
}

但是因为“真正的”集合是 Collection<ChildClass>这会引发错误。或者即使您添加了 ParentClass它会引发错误。总而言之,不好。

解决方案
然而,这可以通过使用 Collection<? extends ParentClass> 来解决在你的类型声明中。这意味着您返回的是 Collection被声明为包含一些可以转换为 ParentClass 的类称为逆变。这样的集合不能向其中添加新对象(除了公认的 null 异常(exception)),因为编译器永远无法保证您尝试放入其中的内容是有效的。但它可以保证从中产生的任何内容都可以转换为 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<ParentClass> parentHolder=new ArrayList<ParentClass>();
ArrayList<ChildClass> childHolder=new ArrayList<ChildClass>();

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; //<-- no longer incompatible types
}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);

}
}

注意为了简洁起见,使用了数组列表,但同样适用于所有集合

关于java - 从指定返回 Collection<ParentType> 的方法返回 Collection<ChildType>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17384015/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com