【问题标题】:How to get a certain object from an interface arraylist如何从接口数组列表中获取某个对象
【发布时间】:2011-03-31 13:47:26
【问题描述】:

大家好,我遇到了一个问题。 假设我有一个接口 Animal。然后我有实现它的类,例如 Dog、Cat、Goat。假设这些类中的每一个都有一个从接口获取的 update() 函数。

我有一个 Animal 的数组列表,其中包括所有不同种类的动物类(狗、猫、山羊)。如果给我一个显示“Goat”的字符串,我将如何搜索该数组列表并仅选择 Goat update() 函数,而忽略 Dog 和 Cat...

【问题讨论】:

    标签: java


    【解决方案1】:
    for ( Animal a : animals ) {
        if ( a instanceof Goat ) {
           a.update();
        }
    }
    

    如果你真的只有字符串“Goat”可以继续,你可以这样做:

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

    或者如果 String 与类的名称无关,您可以将 String 映射到 Class 的实例:

    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();
     }
    

    【讨论】:

    • 是的,我只有字符串可以通过,所以第二个选项成功了
    • @Jonathan:你可能要小心,因为如果你传入"Dog",这也会更新所有PrairieDogs。更好的方法是使用a.getClass().getSimpleName().equals("Goat") 但是,在这两种情况下,您都不会匹配 Goat 的子类,只会匹配完全为 Goat 的对象。第三个选项更稳定。
    【解决方案2】:
    public void goatUpdate(List<Animal> animals) {
        for (Animal animal : animals) {
            if (animal instanceof Goat) {
                animal.update();
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      恐怕你需要通过列表询问每个对象的类型。如果您有List&lt;Animal&gt;,则(据我所知)没有简单的单行方法来获取它的指定子类。

      【讨论】:

        猜你喜欢
        • 2017-03-08
        • 1970-01-01
        • 2022-11-22
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 2015-04-18
        • 1970-01-01
        • 2019-07-03
        相关资源
        最近更新 更多