【问题标题】:Is there a good way to extend a List in a way that every added element gets converted first?有没有一种很好的方法来扩展 List 以首先转换每个添加的元素?
【发布时间】:2020-01-23 08:34:24
【问题描述】:

基本上我有以下几点:

public class BaseClass {}

public class SubClass extends BaseClass {
    public SubClass(BaseClass bc) {...} // converts BaseClass Element to SubClassElement
}

public class BaseList extends ArrayList<BaseClass> {
    Object someOtherAttribute;

    public BaseList(someOtherAttribute) {
         this.someOtherAttribute = someOtherAttribute;
    }
}

现在我想实现一个类

public SubList extends BaseList {
    public SubList(Object someOtherAttribute) {
        super(someOtherAttribute);
    }

    @Override
    public void add(BaseClass baseClass) {
        super.add(SubClass(baseClass));
    }

    //the problem is that I would have to override every single Method like addAll() 
    //because otherwise the elements wouldn't get converted ...
}

在将 BaseClass 的每个元素添加到列表之前将其转换为 Subclass 的元素。

到目前为止,我还没有找到比覆盖List&lt;BaseClass&gt; 的所有方法更好的方法

【问题讨论】:

  • 你究竟为什么需要这样的东西?提供一个常规列表要容易得多,并让该列表的用户负责转换任何输入。也更安全。
  • 为了更明确地说:对于某些类型 T 的良好容器可以让您放入 T,然后取出 T。您所描述的是您放入类型 E 的类型 T 的列表,并且取出类型 T,这将使必须使用该类的人感到困惑,并导致与隐式转换相关的奇妙错误。最好坚持一切和其他人都使用的模式。
  • 最好创建一个复合类:包含两个属性的类:您的自定义属性和列表。
  • 您是否考虑过扩展ArrayList 或其他一些完整的实现并仅覆盖那些至少将一个新元素添加到列表中的方法?这将减少您实现完整类的工作量。
  • 有什么理由不能使用多态性,即List&lt;? extends BaseClass&gt;

标签: java list arraylist


【解决方案1】:

我发现这是一个很好的问题,因为它涉及到一些关于如何实现自定义 List 的思考。我自己过去也遇到过这样的需求。

我刚刚通过ArrayList API 来解决这个问题。这是我认为可以做到的。

  1. 扩展现有的完整实现,例如,ArrayList
  2. 覆盖那些将新元素添加到列表中的方法。例如,add()addAll()set() 等。在被覆盖的方法中,您必须进行转换并调用 super.add()(或任何被覆盖的方法)。
  3. 在您的BaseClassSubClass 上实施一个好的equals()hashcode(),使它们不会相互矛盾。这是indexOf()contains() 等正常工作所必需的。
  4. 如果您收到任何ArrayStoreException,则必须测试toArray()。这一点,我不确定。

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 2019-10-20
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多