【问题标题】:How can I perform an instanceof operation on a member of an arraylist?如何对 arraylist 的成员执行 instanceof 操作?
【发布时间】:2014-12-10 00:21:41
【问题描述】:

首先,我特别需要使用 instanceof 运算符。我有一个基类 Account 和一个扩展 Account 的 CheckingAccount。我有一个 ArrayList 帐户;一个是基本帐户,一个是 CheckingAccount,一个是 SavingsAccount。我需要循环遍历 ArrayList 并调用 CheckingAccount 类独有的方法。这是我的 for 循环:

    for ( Account a : accounts) {
        if (a instanceof CheckingAccount) {
            System.out.println(a.toString()+" "+a.getOverdraftLimit()+" ");
        }
    }

a.getOverdraftLimit 给我一个错误,即 getOverdraftLimit 没有为类型 Account 定义。我的 ArrayList 是由 Account 引用构建的。有没有办法可以直接在调用中使用 instanceof 运算符? CheckingAccount a.getOverdraftlimit 的实例?

【问题讨论】:

    标签: java arraylist instanceof


    【解决方案1】:

    您已经检查了它是否为CheckingAccount,但您仍然有一个Account 类型的引用变量——a

    将其转换为 CheckingAccount,以便您可以调用特定于该类的方法。

    if (a instanceof CheckingAccount) {
        System.out.println(a.toString()+" "+((CheckingAccount) a).getOverdraftLimit()+" ");
    }
    

    更面向对象的方法如下:

    CheckingAccount 中覆盖toString()。让该方法将透支限制作为返回字符串的一部分返回,这样就不必将Account 转换为CheckingAccount 只是为了调用getOverdraftLimit

    【讨论】:

    • 我实际上确实重写了toString(),我们现在正在学习继承,我们应该这样做,所以我们不得不使用instanceof。我同意,你的方法会好得多。谢谢!
    【解决方案2】:

    您需要对a 进行强制转换才能使用CheckingAccount 方法:

    System.out.println(a.toString()+" "+((CheckingAccount)a).getOverdraftLimit()+" ");
    

    为此目的声明一个新变量是很常见的,特别是如果它会被多次使用:

    CheckingAccount checking = (CheckingAccount)a;
    System.out.println(checking.toString()+" "+checking.getOverdraftLimit()+" ");
    

    【讨论】:

      【解决方案3】:

      a 转换为CheckingAccount(因为你知道它是一个)然后调用该方法。

      CheckingAccount ca = (CheckingAccount)a;
      ca.getOverdraftLimit(); //no error.
      

      【讨论】:

      • 感谢您的快速回答!
      猜你喜欢
      • 2021-11-24
      • 2021-11-14
      • 2020-09-03
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多