列表的连续继承

时间:2013-05-24 07:54:08

标签: java list inheritance arraylist

我有一个List结构设置:

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

会出现"Type mismatch: Cannot convert from RowList to List<List<Value>>"错误。实施如下:

public class RowList extends ArrayList<ValueList>
public class ValueList extends ArrayList<Value>

Value是我的代码库中的一个对象。为什么这不起作用?当我这样做时,一切正常:

public class RowList extends ArrayList<List<Value>>

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

现在听起来这不是正确的做事方式,但我真的没有任何选择,因为我们不允许改变执行此操作的代码。我相信这个想法是让我们考虑仿制药。

2 个答案:

答案 0 :(得分:8)

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

现在要理解为什么这不编译,这就是为什么,用一个简短的例子。假设您想要做的事情是可能的并且编译,那么您可以这样做:

RowList rowList = new RowList();
List<List<Value>> listOfLists = rowList;
listOfLists.add(new LinkedList<Value>());

虽然RowList应该仅包含ValueList的实例,但你的内部会有一个LinkedList<Value>,从而破坏了程序的类型安全性和正确性。

答案 1 :(得分:1)

问题是,RowList不是List<List<Value>>,因此List<List<Value>> l = new RowList();无效

就像你不能这样做:

List<Object> objList = new ArrayList<String>();

您有几种选择:

将l的声明更改为List:

List<ValueList> l = new RowList();

或使用通配符:

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

编辑:虽然可以通过上述方法解决,但您的设计应该更好地重构。我认为您正在尝试使用继承在C / C ++中执行类似typedef的操作,但使用继承来模拟typedef的副作用很大(至少在Java中)并且在执行此操作之前应该三思而后行。我并不是说你不应该使用继承,如果它真的有意义(即你真的希望ValueList是一个List<ValueList>)。然而,在我看来,您这样做只是为了节省您输入List<Value>而不是引入有意义的类型。