【问题标题】:How do I create an ArrayList filled with different types of objects?如何创建一个填充不同类型对象的 ArrayList?
【发布时间】:2018-10-31 04:32:01
【问题描述】:

我有不同的银行系统类。这些类是;

  • 储蓄账户
  • 学生账户
  • 普通账户

现在我想创建一个 ArrayList 并用所有这些不同类的对象填充它,例如第一个元素是 studentaccount1,第二个元素是savingaccount 2...等等。

所以我尝试使用对象类型:

List<Object> accountList = new ArrayList<>();

但是使用这种方法,由于某种原因,我无法访问存储在类变量中的值,例如:

accountList.add(saving1);

accountList.get(saving1) 不会显示在这些类中声明的方法。

那么我该如何解决这个问题,或者以某种其他方式实现它?

编辑:

我忘了说普通帐户是父类,StudentAccountSavingsAccount 都是子类。

因此我意识到我可以只将 ArrayList 声明为NormalAccount 类型(父类类型)并实现我想要的。

【问题讨论】:

  • 这些类之间的类层次结构是什么?
  • 三个账户类有父类吗?
  • NormalAccount 是父类,Student 和 Savings 都是继承自 NormalAccount 的子类
  • 您可以在这些对象之间创建层次结构,似乎 BankAccount 类可以作为您在此处拥有的这些类的父级。然后您可以将基本方法添加到您的父类,并将特定于帐户的方法添加到您的子类。那么列表将是: List list = new ArrayList();当你得到时,你需要检查哪个实例是什么。

标签: java list generics inheritance arraylist


【解决方案1】:

用常用方法创建一个接口Account,并让所有这些账户都实现它。

public class SavingsAccount implements Account { ... }

然后创建一个实现这个接口的类型列表。

List<Account> accountList = new ArrayList<>();

我不建议您仅仅为此目的创建一个标记界面。这是个坏主意。接口应该有公共方法。

或者,Account 本身可以是一个(抽象)类,这些特定帐户将从它扩展 - 包括通用功能以避免代码重复。这取决于您到底想要实现什么以及哪一个适合您的设计。

编辑:

您没有向我们透露一个非常重要的事实,即NormalAccount 是其他人的父母。因此解决方案非常简单:

List<NormalAccount> accountList = new ArrayList<>();

【讨论】:

    【解决方案2】:

    你的班级有后缀_Account所以我猜他们有相似的领域。

    为它们创建一个超类,无论是接口还是类:

    public class Account {
    }
    
    public class StudentAccount extends Account {
    }
    

    然后将您的列表声明为:

    List<Account> accountList = new ArrayList<>();
    
    Account normal = new NormalAccount();
    accountList.add(normal);
    

    【讨论】:

      【解决方案3】:

      您无法访问类的方法。相反,您只能在示例中访问 Object 类的方法。

      我认为您可以将通用方法声明放在接口或抽象类中,然后实现它们。

      我忘了提到普通帐户是父类,两者都是 “StudentAccount”和“SavingsAccount”是子类。

      所以我可以将 ArrayList 声明为“NormalAccount”类型,然后 可以访问变量吗?

      是的,没错。你可以这样定义,

      List<NormalAccount> accountList = new ArrayList<>();
      

      【讨论】:

        【解决方案4】:

        当你使用 Object 类时,在检索数据的过程中,你需要对检索到的数据进行强制转换才能使用方法。试试这样的:

        (SavingsAccount) accountList.get(saving1)

        您将能够访问这些方法

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多