【问题标题】:Creating an ArrayList from superclass but containing objects from extended classes从超类创建一个 ArrayList 但包含来自扩展类的对象
【发布时间】:2018-11-16 09:15:13
【问题描述】:

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

    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));
    }

【问题讨论】:

  • 如果它们之间有is-a关系,你可以这样做
  • 如果 EmailContact PhoneContact 扩展 Contact 您可以将它们添加到 ArrayList&lt;Contact&gt; 列表中
  • con.add(new EmailContact(date, email));而是
  • @TrungNTNguyen 谢谢你。
  • 你想对数组内容做什么?因为在检索对象时会很尴尬,因为您不会真正知道它是 EmailContact 还是 PhoneContact,而且更多因此您将无法分别使用 getEmailgetPhone 方法,只有当您将检索到的联系人显式转换为他们预期的班级,这通常会引发ClassCastException

标签: java generics arraylist


【解决方案1】:

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

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

【讨论】:

  • 谢谢你。你知道我怎样才能用不同的方法分别得到它们吗?
  • 两个方法需要共享同一个列表,作为参数或者声明为实例变量
  • @nits.kk 你能详细说明一下吗?我是java新手,不太了解你的逻辑。
【解决方案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{

}

【讨论】:

    【解决方案3】:

    这是基本的多态性。引用可以是超类型,但它可以引用任何子类型的对象。关键字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);
    

    【讨论】:

      【解决方案4】:

      假设这是层次结构:

      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类型。所以不要在没有检查 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-09
        • 2013-07-22
        • 2023-03-27
        • 1970-01-01
        • 2014-07-14
        • 1970-01-01
        相关资源
        最近更新 更多