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