访问arrayList中的子类变量

时间:2019-02-21 12:33:37

标签: java arraylist

我想访问名为getDimensioni的{​​{1}}子类的元素的方法Campo

这是我要执行的代码:

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

2 个答案:

答案 0 :(得分:4)

由于您的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");
        }
    }
}

答案 1 :(得分:0)

  

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

ArrayList<Campo> campiprenotati;

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

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