首页 > 解决方案 > 访问子类的属性

问题描述

我对 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;
          }
  }

标签: javainheritancecompiler-errorsiteration

解决方案


在这个答案中,我假设VIPGuestextends 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。


推荐阅读