【发布时间】:2014-06-18 20:48:53
【问题描述】:
在我的应用程序中,我有一个主要基于两个类层次结构的模型:容器和元素。容器通过列表引用元素。
例如,考虑作为Parent 子类型的Java 类Child 和作为ElementParent 子类型的ElementChild。这些元素用作列表的类型参数,我希望每个容器都可以从其列表中添加、删除和获取元素。这些列表应尽可能严格,即应包含位于同一层次结构的元素 (Child - ElementChild)。
我知道List<ElementParent> 和List<ElementChild> 不是子类型关系,有没有比创建两个不同的列表更好的方法(Parent 中的List<ElementParent> 和Child 中的List<ElementChild>)?
在以下示例中,我使用继承列表来说明我的意思,但显然它无法编译:
public class Parent {
protected List<ElementParent> list;
public Parent () {
list = new ArrayList<ElementParent>();
}
public List<ElementParent> getList() {
return list;
}
public void add(ElementParent element) {
list.add(element);
}
public void remove (ElementParent element) {
list.remove(element);
}
public void setList(List<ElementParent> list) {
this.list = list;
}
}
public class Child extends Parent {
public Child() {
list = new ArrayList<ElementChild>(); // does not compile
}
public List<ElementChild> getList() { //does not compile
return list;
}
public void add(ElementChild element) {
list.add(element);
}
public void remove (ElementChild element) {
list.remove(element);
}
public void setList(List<ElementChild> list) { //does not compile
this.list = list;
}
}
【问题讨论】:
-
可以把相关代码放在这里吗?你的哪些类是通用的?对我来说听起来没有。
-
List<? extends ElementParent>. -
@christopher:那将是一个仅限生产者的列表。
-
这里的泛型就是列表,每个容器都应该有一个列表的引用,元素就是类型参数。让我想一个清晰的代码,我会发布它。
-
类似的解决方案是否也适用于您:stackoverflow.com/questions/24292827/…(引入另一个通用参数)。