我想访问称为getDimensioni
的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
: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;
}
}
最佳答案
由于您的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");
}
}
}