Java 列表的连续继承

Java 列表的连续继承,java,list,inheritance,arraylist,Java,List,Inheritance,Arraylist,我有这样的列表结构设置: List<List<Value>> l = new RowList(); List l=新建行列表(); 这会导致类型不匹配:无法从行列表转换为列表错误。实施情况如下: public class RowList extends ArrayList<ValueList> public class ValueList extends ArrayList<Value> 公共类行列表扩展了ArrayList 公共类值列表扩展

我有这样的列表结构设置:

List<List<Value>> l = new RowList();
List l=新建行列表();
这会导致类型不匹配:无法从行列表转换为列表错误。实施情况如下:

public class RowList extends ArrayList<ValueList>
public class ValueList extends ArrayList<Value>
公共类行列表扩展了ArrayList
公共类值列表扩展了ArrayList
值是我的代码库中的一个对象。为什么这不起作用?当我用这个替代时,一切正常:

public class RowList extends ArrayList<List<Value>>
公共类行列表扩展了ArrayList
对于我正在处理的大学作业,我们的讲师编写的代码通过调用一个方法来工作,该方法在我的代码中返回一个
List
,然后将
List
添加到该列表中。由于该程序旨在实现一个数据库,因此有许多要求,例如键值不会出现多次等。要检查这是否发生,我需要能够有一个ValueList类或类似的东西,以便我可以扩展
add()
方法来检查这些要求


现在听起来这似乎不是正确的方法,但我在这件事上真的没有任何选择,因为我们不允许修改执行此操作的代码。我相信这会让我们想到泛型。

首先创建集合的子类是个坏主意。坚持使用标准实现,使用组合而不是继承

现在,为了理解为什么它不能编译,下面给出一个简短的例子。假设您想做的事情是可能的,并且已编译,那么您可以执行以下操作:

RowList rowList = new RowList();
List<List<Value>> listOfLists = rowList;
listOfLists.add(new LinkedList<Value>());
RowList RowList=new RowList();
列表列表=行列表;
添加(新的LinkedList());

虽然行列表应该只包含
ValueList
的实例,但是您会在其中包含一个
LinkedList
,这会破坏程序的类型安全性和正确性。

问题是,
RowList
不是
列表,因此
List l=new RowList()无效

就像你不能这样做:

List<Object> objList = new ArrayList<String>();
List objList=new ArrayList();
您有几种选择:

将l更改为列表的声明:

List<ValueList> l = new RowList();
List l=新建行列表();
或使用通配符:

List<? extends List<Value>> l = new RowList();

list能否请您详细说明您的第一句话(不要将集合子类化)?如果可能的话,有链接吗?谢谢。请参阅@JBNizet。我的问题是,此分配需要返回一个列表,另一个类可以在其中添加/删除元素。我需要能够拦截这些添加和删除来检查有效性。如果我使用构图,那么我没有办法做到这一点。很好的参考,谢谢@JBNizet。尽管我仍然认为,扩展类(例如,
ArrayList
)以添加功能是一种很好的工作方式——如果它在有限的范围内,正如《有效的Java》中所提到的那样。使用组合是在不破坏列表契约的情况下做到这一点的唯一方法。列表不应拒绝任何添加的元素。将列表包装到一个自定义类中,该类提供一个add()方法,该方法引发一些InvalidObjectException。不要扩展列表来做这件事:你会打破Liskov原则。此外,使用继承肯定会失败,并且在使用下一版本的JDK时代码会中断,因为有任何方法可以将元素添加到列表(add、addAll、迭代器等)。术语说明:“多重继承”通常用于一个类从两个或多个基继承的情况。在爪哇,只有当“一个”基中的所有都是接口时才支持,因此Java通常被认为不支持多重继承,而C++则是(java特别选择不复制java)。拥有继承链通常不被称为“多重继承”,因此称之为“多重继承”有点令人困惑。@Steve314我将其改为“连续继承”:希望这不会那么模棱两可。