我想访问名为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
答案 0 :(得分:4)
由于您的ArrayList
是Campo
个元素,所以您不知道它仅包含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;
}
现在您可以创建并传递子类的列表对象并使用它,但这仍然不是您代码的良好设计。