当前位置: 代码迷 >> java >> 访问arrayList中的子类变量
  详细解决方案

访问arrayList中的子类变量

热度:68   发布时间:2023-07-17 20:12:47.0

我想访问Campo子类Calcio的元素的getDimensioni方法。

这是我要执行的代码:

ArrayList<Campo> campiprenotati = new ArrayList<>();

public void prenotazioniCC7(){
    for (Calcio calcio : campiprenotati) {
        if("7".equals(calcio.getDimensioni())) { 
            System.out.println(calcio.tostring());
        } else {
            System.out.println("Campo non trovato");
        }
        }
    }
}

这是Calcio.java

public class Calcio extends Campo {
    private String dimensioni;

    public Calcio(String ID, boolean illuminazione, String dimensioni) {
        super(ID, illuminazione);
        this.dimensioni = dimensioni;
    }

    public void setDimensioni() {
        this.dimensioni = dimensioni;
    }

    public String getDimensioni() {
        return dimensioni;
    }

    @Override public String toString() {
        return super.toString() + " " + dimensioni;
    }
}

因为您的ArrayListCampo元素,所以您不能知道它仅包含Calcio元素(它可能具有Campo或其他子类类型的元素),因此您不能将Calcio用作for循环元素类型。 可以使用Campo ,然后使用instanceof来确定Campo是否是Calcio ,如下所示:

public void prenotazioniCC7(){
    for (Campo campo : campiprenotati) {
// ------^^^^^^^^^^^
        if (campo instanceof Calcio && "7".equals(((Calcio)campo).getDimensioni())) { 
// ---------^^^^^^^^^^^^^^^^^^^^^^^^^^------------^^^^^^^^^^^^^^^
            System.out.println(campo.toString());
// ----------------------------^^^^^
        } else {
            System.out.println("Campo non trovato");
        }
    }
}

通常(尽管并非总是)使用instanceof建议您可能要以不同的方式构造事物,例如,使数组仅包含Calcio元素。

例如,oOne方法(如在评论中所建议)将是识别需要包含在此列表(以及类似列表)中的元素的所有公共方面,并将其置于与所有相关类实现:

public class Campo /*...*/

public interface TheInterface {
    String getDimensioni();
}

public class Calcio extends Campo implements TheInterface /*...*/
//                  ^^^^^^^^^^^^^-- only if necessary and appropriate

然后

ArrayList<TheInterface> campiprenotati = new ArrayList<>();

public void prenotazioniCC7(){
    for (TheInterface entry : campiprenotati) {
        if ("7".equals(entry.getDimensioni())) { 
            System.out.println(entry.toString());
        } else {
            System.out.println("Campo non trovato");
        }
    }
}

这取决于用例中的调用方式以及创建此列表的位置,使用构造函数将列表对象注入基类并在方法中使用,如果列表是在运行时创建的,则可以将该列表注入构造函数。

ArrayList<Campo> campiprenotati;

public MyClass(final ArrayList<Campo> campiprenotati){
    this.campiprenotati = campiprenotati;
}

现在,您可以创建并传递子类的列表对象并使用它,但这仍然不是您代码的良好设计。

  相关解决方案