我有三个类:Blob,Food和Predator,所有这些都是抽象类Organism的子类.
我还为每个类都有一个ArrayList:blob,食物和捕食者
我正在编写一个函数,它将为生物体选择一个"目标",具体取决于它的类型.有机体作为参数传递,然后选择适当的目标 - 如果Blob通过然后它应该以食物为目标,如果通过Predator然后它应该以Blob为目标,并且如果食物通过那么它应该以捕食者.现在我有:
ArrayList<Food> foods = new ArrayList<Food>();
ArrayList<Blob> blobs = new ArrayList<Blob>();
ArrayList<Predator> predators = new ArrayList<Predator>();
public Organism pickTarget(Organism o){
ArrayList<Organism> search = new ArrayList<Organism>();
if(o.getClass() == Blob.class){
search = foods;
}
else if(o.getClass() == Predator.class){
search = blobs;
}
else if(o.getClass() == Food.class){
search = predators;
}
Organism target = search.get(0);
for(Organism organism:search){
//do stuff to pick a target from assigned search space
}
return target;
}
Run Code Online (Sandbox Code Playgroud)
因此,这里的想法是初始化一个通用的Organisms ArrayList,然后根据参数的类型为其分配一个现有的ArrayLists.然后将搜索该ArrayList以寻找返回的最合适的目标.
但是当我尝试将现有的ArrayList分配给搜索变量时,我遇到了类型不匹配错误.例如,'无法转换ArrayList<Food>为ArrayList<Organism>'.
有人知道像这样的问题的解决方案吗?从子类转换为超类通常不是问题所以我希望有一个ArrayLists的解决方案.
你所面临的根本问题是,List<Subclass>是不是一个亚型List<Superclass>.
解决问题的方法是使用泛型绑定声明变量:
List<? extends Organism> search;
Run Code Online (Sandbox Code Playgroud)
然后这将编译:
search = foods;
Run Code Online (Sandbox Code Playgroud)
声明的List<? extends Organism>意思是"作为生物子类型的未知类型的列表".在代码中,这种列表的元素至少是一个有机体,但确切的类型是未知的.
| 归档时间: |
|
| 查看次数: |
484 次 |
| 最近记录: |