我想访问称为getDimensioniCampo子类的元素的方法Calcio

这是我要执行的代码:

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方法(如注释中的TungstenX所建议)将是识别需要包含在此列表(和类似列表)中的元素的所有公共方面,并将它们放在一个接口中,以使所有相关的类实现:

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

09-28 09:54