问题描述
我想访问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;
}
}
1楼
因为您的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方法(如在评论中所建议)将是识别需要包含在此列表(以及类似列表)中的元素的所有公共方面,并将其置于与所有相关类实现:
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");
}
}
}
2楼
这取决于用例中的调用方式以及创建此列表的位置,使用构造函数将列表对象注入基类并在方法中使用,如果列表是在运行时创建的,则可以将该列表注入构造函数。
ArrayList<Campo> campiprenotati;
public MyClass(final ArrayList<Campo> campiprenotati){
this.campiprenotati = campiprenotati;
}
现在,您可以创建并传递子类的列表对象并使用它,但这仍然不是您代码的良好设计。