【问题标题】:Only allow specific types in an ArrayList仅允许 ArrayList 中的特定类型
【发布时间】:2011-10-09 15:41:25
【问题描述】:

有没有办法将 ArrayList 类子类化为只允许特定类(或其子类)的对象。
具体来说,我有一个名为 RecordStatus 的基类,我需要使用基于此类的对象创建 ArrayLists。
我知道基于ArrayList<RecordStatus> 创建一个类很容易,但是每次我从数组中检索一个元素时,我都需要将它转换为原始类。
有没有更简单的方法来做到这一点?

【问题讨论】:

  • ArrayList<WhateverSubclassYouWant>?还是我误解了这个问题?
  • arraylist是否包含RecordStatus的不同子类?
  • 你能发布一些代码来解释你遇到问题的地方吗?

标签: java generics arraylist


【解决方案1】:

有没有办法将 ArrayList 类子类化为只允许对象 特定类(或其子类)。具体来说,我有一个基础 名为 RecordStatus 的类,我需要使用对象创建 ArrayLists 基于这个类。

这正是 Java 中的泛型结构允许您做的事情。请注意,只要RecordStatus 的所有子类都具有相同的API,您就不必强制转换来自ArrayList<RecordStatus> 的实例。仅当子类具有不同的方法/字段时,您才需要这样做。例如,如果RecordStatus 有一个方法setStatus,子类也有,则不需要强制转换,因为Java 多态性的动态调度将根据实例的类型确保实现的方法是正确的在运行时调用的方法。

【讨论】:

    【解决方案2】:

    如果您正确设置类型,则不需要强制转换任何内容。例如,这应该有效:

    List<RecordStatus> myList = new ArrayList<RecordStatus>();
    //Add values to the list
    RecordStatus myRecordStatus = myList.get(0);
    

    但如果你真的想继承 ArrayList,你可以这样做:

    private class MyArrayList<R extends RecordStatus> extends ArrayList<R> {
          ...
    }
    

    【讨论】:

      【解决方案3】:

      ArrayList&lt;? extends RecordStatus&gt; 尽可能接近。

      【讨论】:

      • 定义数组的泛型类型,而不是数组中的类型。您仍然可以将RecordStatus 的子类放入ArrayList&lt;RecordStatus&gt;
      【解决方案4】:

      我已经使用这样的行轻松创建了arrayList

      List<RecordStatus> list = new ArrayList<RecordStatus>();
      

      【讨论】:

        【解决方案5】:

        试试Collections.checkedList(List&lt;E&gt; list, Class&lt;E&gt; type)。这将确保类型安全。

        【讨论】:

          猜你喜欢
          • 2020-08-09
          • 2012-01-13
          • 2010-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多