从超类创建ArrayList但包含扩展类的对象

时间:2018-11-16 09:15:14

标签: java generics arraylist

我有3节课。联系人,电子邮件联系人和电话联系人。我想创建一个可以同时包含来自EmailContact和PhoneContact的对象的Arraylist。而且我需要找到一种方法来获取这些对象。这是我到目前为止所拥有的,但是似乎并没有像我想要的那样拆分它们。

    public void addEmailContact(String date, String email) {
        ArrayList<Contact> con = new ArrayList<>();
        con.add(new Contact(date, email));
    }

    public void addPhoneContact(String date, String phone) {
        ArrayList<Contact> con = new ArrayList<>();
        con.add(new Contact(date, phone));
    }

4 个答案:

答案 0 :(得分:4)

通配符可以帮助您。可以将扩展Contact类的任何类添加到接受? super Contact

的列表中
List<? super Contact> list= new ArrayList<>();
list.add(new EmailContact());
list.add(new PhoneContact());

答案 1 :(得分:2)

import java.util.ArrayList;
import java.util.List;

public class Contact {


    public static void main(String[] args) {
        List<? super Contact>  list = new ArrayList<>();
        list.add(new PContact());
        list.add(new EContact());

    }
}

class PContact extends Contact{

}
class EContact extends Contact{

}

答案 2 :(得分:0)

这是起作用的基本多态性。引用可以是超级类型,但可以引用任何子类型的对象。关键字new实例化一个对象。您需要为实际的实现提供新的信息。就您而言

 Contact con = new PhoneContact(date, phone);
 Contact anotherCon = new EmailContact(date, email); 

因此,现在使用ArrayList可以执行以下操作。

List<Contact> list = new ArrayList<>();
list.add(new EmailContact(date,email);
list.add(new PhoneContact(date,phone);

答案 3 :(得分:0)

假设这是层次结构:

abstract class Contact { }

class EmailContact extends Contact { }

class PhoneContact extends Contact { }

您可以执行以下操作:

List<? super Contact> myList = new ArrayList<>();
myList.add(new EmailContact());
myList.add(new PhoneContact());

通配符表示您可以将扩展 Contact的任何类添加到列表中。

请注意,当您从myList获取元素时,唯一的保证是它将返回Object type 。因此,请勿在未检查Contact的正确 instance 的情况下尝试投射它,否则将导致 ClassCastException

例如:

Object contact = myList.get(0);        
if (contact instanceof EmailContact) {
    EmailContact emailContact = (EmailContact) contact;
} else if (contact instanceof PhoneContact) {
    PhoneContact phoneContact = (PhoneContact) contact;
}