java - 访问子类的属性
问题描述
我对 Java 很陌生,并且正在努力了解为什么我在命令行中不断收到错误。我有一个超类Guest,带有变量guestID、fName、lName 和dateJoin。我还有一个带有附加变量 VIPstartDate 和 VIPexpiryDate 的子类 VIPGuest。
我有一个 ArrayList 来宾,它包含我记录中的所有来宾对象。我想遍历ArrayList并将每个Guest写入一个文本文件,每个Guest以guestID,fName,lName,dateJoin形式的新行以逗号分隔(或guestID,fName,lName,dateJoin,VIPstartDate,VIPexpiryDate if客人是 VIPGuest)。
我的代码如下。当我使用类似的代码为没有子类的类的对象的 ArrayList 做类似的事情时,它工作得很好,但是当我尝试让它解决一些客人有额外变量的事实时,错误是:
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;
}
}
解决方案
在这个答案中,我假设VIPGuest
extends Guest
。
VIPGuest
在您可以在常规上使用任何方法之前Guest
,您需要将 Guest 转换为 VIPGuest。
for (Guest g : guests){
if (!(g instanceof VIPGuest)){
// omitted for brevity
} else {
VIPGuest vip = (VIPGuest)g;
writer.write(vip.getGuestID() + "," + vip.getFName() + "," + vip.getLName() + "," +
vip.getDateJoin() + "," + vip.getVIPstartDate() + "," + vip.getVIPexpiryDate());
}
writer.newLine();
}
虽然您知道——通过使用instanceof
支票——这g
实际上是一位 VIPGuest,但您对它的引用只是一位来宾。
请注意,如果g
实际上不是 的实例VIPGuest
,则尝试(VIPGuest)g
的强制转换可能会抛出 ClassCastException。
推荐阅读
- c++ - 使用 C++ 排队学习
- python - 从另一个数组中选择具有列索引的每一行中的元素
- java - 在封闭范围内定义的 Bool var dbgotAltered
- c++ - 来自 C++ lambda 的 auto&& 返回类型
- javascript - 在 JSON 中获得图像链接后,如何使图像出现在网络浏览器上
- terraform - 有没有办法在 terraform 中导入 iam-roles?
- python - 为什么使用 jinja2 时我的 html 显示为空白?
- r - 为什么 Microsoft excel 97-2003 工作表的第一列将变量名称读取为 R 中的观察值?
- node.js - Heroku H18“服务器请求中断”错误将图像表单数据从节点发送到 Flask,来自 Postman
- ionic4 - ionic 4内置apk未安装