2011-03-31 76 views
1

嗨,我们在一个问题上陷入困境。 说我有一个界面动物。然后我有实施它的课程,如狗,猫,山羊。说每个这些类都有一个从接口获得的update()函数。如何从界面数组列表中获取某个对象

我有一个Animal列表,包括所有不同种类的动物类(狗,猫,山羊)。如果我得到一个字符串,说“喜羊羊”如何将我搜索该ArrayList和选择只山羊update()函数,忽略了狗和猫...

回答

6
for (Animal a : animals) { 
    if (a instanceof Goat) { 
     a.update(); 
    } 
} 

如果你真的只有字符串“喜羊羊“去,你可以做这样的事情:

if (a.getClass().getName().endsWith("Goat")) { 
    //... 

或者如果字符串无关类的名称,你可以映射一个String类的一个实例:

Map<String, Class<? extends Animal>> map = new HashMap... 
map.put("Goat", Goat.class); 

//... 
if (map.get("Goat").isInstance(a)) { 
    a.update(); 
} 

在我看来Google's Guava是最好的选择:

for (Goat g : Iterables.filter(animals, Goat.class)) { 
    g.update(); 
} 
+0

非常感谢你!刚刚重新启动java并忘记了基本知识... – thunderousNinja 2011-03-31 13:50:11

+0

是的,我只有字符串去,所以第二个选项做了诡计 – thunderousNinja 2011-03-31 14:11:16

+1

@Jonathan:你可能想要小心,因为这也会更新所有'PrairieDog'例如,如果你通过了''狗'''''。更好的方法是使用'a.getClass()。getSimpleName()。equals(“Goat”)'然而,在这两种情况下,你都不会匹配Goat的子类,而只能匹配“Goat”的对象。第三种选择更稳定。 – 2011-03-31 14:20:37

0

恐怕你需要去通过列表,询问每个对象的类型。如果你有List<Animal>,那么(据我所知)并不是简单的单行方法来获取它的唯一指定的子类。

1
public void goatUpdate(List<Animal> animals) { 
    for (Animal animal : animals) { 
     if (animal instanceof Goat) { 
      animal.update(); 
     } 
    } 
} 
相关问题