我对 Java 还很陌生,并且很难理解为什么我总是在命令行中收到错误。我有一个父类(super class) Guest,带有变量 guestID、fName、lName 和 dateJoin。我还有一个带有附加变量 VIPstartDate 和 VIPexpiryDate 的子类 VIPGuest。
我有一个 ArrayList guest,它保存我记录中的所有 guest 对象。我想迭代 ArrayList 并将每个 guest 写入一个文本文件,每个 guest 以 guestID、fName、lName、dateJoin 的形式换行,并用逗号分隔(或 guestID、fName、lName、dateJoin、VIPstartDate、VIPexpiryDate 如果该客人是 VIP 客人)。
我的代码如下。当我使用类似的代码对没有子类的类的对象的 ArrayList 执行类似的操作时,它工作得很好,但是当我尝试让它解决某些 guest 有额外变量的事实时,错误是:
HotelImpl.java:440: error: cannot find symbol
+ "," + g.getVIPstartDate() + "," + g.getVIPexpiryDate());
^
symbol: method getVIPstartDate()
location: variable g of type Guest
HotelImpl.java:440: error: cannot find symbol
+ "," + g.getVIPstartDate() + "," + g.getVIPexpiryDate());
^
symbol: method getVIPexpiryDate()
location: variable g of type Guest
2 errors
我可以看到 VIPGuest 对象的额外变量有问题,但我想我已经用 if/else 修复了这个问题:
public boolean saveGuestsData(String guestsTxtFileName){
BufferedWriter writer;
try{
writer = new BufferedWriter(new FileWriter(guestsTxtFileName));
} catch (IOException e){
System.out.print("Invalid file.");
return false;
}
try{
for (Guest g : guests){
if (!(g instanceof VIPGuest)){
writer.write(
g.getGuestID() + "," + g.getFName() + "," + getLName()
+ "," + g.getDateJoin());
}
else {
writer.write(
g.getGuestID() + "," + g.getFName() + "," +
getLName() + "," + g.getDateJoin() + "," +
g.getVIPstartDate() + "," + g.getVIPexpiryDate());
}
writer.newLine();
}
writer.close();
return true;
} catch (FileNotFoundException ex) {
System.out.print("File not found.");
return false;
} catch (IOException e){
System.out.print("Invalid file.");
return false;
}
}
最佳答案
g
是 Guest
类型的引用,因此您只能从中访问 Gusest
的成员。如果您想访问 VIPGuest
的成员,则必须显式向下转换它。例如:
VIPGuest vg = (VIPGuest) g;
writer.write(g.getGuestID() + "," +
g.getFName() + "," +
g.getLName() + "," +
g.getDateJoin() + "," +
vg.getVIPstartDate() + "," +
vg.getVIPexpiryDate());
这应该可行,但这是一个糟糕的设计,它迫使您的 saveGuestsData
方法深入了解您的 Guest
实现。更稳健的设计是将此逻辑移至 Guest
类,并让此方法仅调用它们:
public class Guest {
@Override
public String toString() {
return getGuestID() + "," + getFName() + "," + getLName() + "," + g.getDateJoin();
}
// other methods...
}
public class VIPGuest extends Guest {
@Override
public String toString() {
return super.toString() + ", " + getVIPstartDate() + "," + getVIPexpiryDate());
// other methods...
}
然后调用这个方法:
for (Guest g : guests) {
writer.write(g.toString());
}
关于java - 访问子类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55106814/