我有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));
}
答案 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;
}