如何创建一个填充了不同类型对象的ArrayList?

时间:2018-05-21 13:38:22

标签: java list generics inheritance arraylist

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

  • SavingsAccount
  • StudentAccount
  • NormalAccount

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

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

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

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

accountList.add(saving1);

accountList.get(saving1)没有提出在这些类中声明的方法。

那么我怎么能解决这个问题,或者以某种其他方式实现呢?

编辑:

我忘了提到普通帐户是父类,而StudentAccountSavingsAccount都是子类。

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

4 个答案:

答案 0 :(得分:1)

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

public class SavingsAccount implements Account { ... }

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

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

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

或者,Account可以是(抽象)类本身,这些特定帐户将从中扩展 - 包括避免代码双重性的常用功能。这取决于你想要达到的目标,以及哪一个适合你的设计。

编辑:

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

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

答案 1 :(得分:0)

您的课程后缀为DEVNAME=/dev/...YOURDISK sudo /lib/udev/hdparm,所以我猜他们有相似的字段。

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

_Account

然后将您的列表声明为:

public class Account {
}

public class StudentAccount extends Account {
}

答案 2 :(得分:0)

您无法访问类的方法。相反,您只能在示例中访问//SHOW PRIMARY ADDRESS FROM DB set by user // $myid is users id from DB <?php $primaryaddsql = "SELECT * FROM cust_address WHERE cust_ID = '$myid' AND primary_add = '1'"; $primaryadd = mysqli_query($conn,$primaryaddsql); $mainaddress = mysqli_fetch_assoc($primaryadd) echo' <div class="mainAdd" > <p class="thisadd">'.$mainaddress['address_1'].'</p> <p class="thisadd">'.$mainaddress['address_2'].'</p> <p class="thisadd">'.$mainaddress['city'].'</p> <p class="thisadd">'.$mainaddress['country'].'</p> <p class="thisadd">'.$mainaddress['post_code'].'</p>'; ?> //SHOW ALL ADDRESSES FROM DB FOR USER TO CHOOSE FROM <?php $myaddsql = "SELECT * FROM cust_address WHERE cust_ID = '$myid' AND primary_add != '1' "; $myaddresults = mysqli_query($conn,$myaddsql); while($myrow = mysqli_fetch_assoc($myaddresults)){ echo ' <div class="myleft" data-id="'.$myrow['address_ID'].'"> <p class="thisadd" >'.$myrow['address_1'].'</p> <p class="thisadd">'.$myrow['address_2'].'</p> <p class="thisadd">'.$myrow['city'].'</p> <p class="thisadd">'.$myrow['country'].'</p> <p class="thisadd">'.$myrow['post_code'].'</p> </div> '; } ?> 类的方法。

我认为你可以在接口或抽象类中放置常用的方法声明,然后实现它们。

  

我忘了提到普通帐户是父类,两者都是   &#34; StudentAccount&#34;和&#34; SavingsAccount&#34;是子类。

     

所以我可以将ArrayList声明为&#34; NormalAccount&#34;键入然后   能够访问变量吗?

是的,确切地说。您可以将其定义为,

Object

答案 3 :(得分:0)

使用Object类时,在检索数据期间,需要转换检索到的数据才能使用这些方法。尝试这样的事情:

  

(SavingsAccount)accountList.get(saving1)

您将能够访问方法