在我的应用程序中,我有一个主要基于两个类层次结构的模型:容器和元素。容器通过列表引用了元素。
例如,考虑一个Java类Child
,它是的子类型,Parent
并且ElementChild
是的子类型ElementParent
。这些元素用作列表的类型参数,我希望每个容器都可以从其列表中添加,删除和获取元素。这些列表应尽可能严格,即应包含放置在相同层次结构(Child
- ElementChild
)上的元素。
我知道List<ElementParent>
并且List<ElementChild>
不在子类型关系中,是否有比仅创建两个不同的列表(List<ElementParent>
inParent
和List<ElementChild>
in Child
)更好的方法?
在下面的示例中,我使用了继承列表来显示我的意思,但显然它无法编译:
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<ElementParent>
和List<ElementChild>
不在子类型关系中。
由于存在Child extends Parent
和Parent::add(ElementParent element)
方法,因此它继承到Child
。
现在您可以编写:
ElementParent ep = ...;
Child child = ...;
child.add(ep); //perfectly legal
但是那会怎么办呢?添加ElementParent
到ElementChild
s的列表?这就是为什么List<ElementParent>
和List<ElementChild>
不处于子类型关系的原因。
那么如何解决您的问题呢?
例如List<ElementParent>
,通配符可能会有所帮助,而且List<ElementChild>
两者都可以List<? extends ElementParent>
,您可以ElementParent
从阅读List<? extends ElementParent>
,但很遗憾,您不能在其中写任何东西(除外null
)。
与下限类似List<? super ElementChild>
,但是在您的位置上,我会重新考虑您要达到的目标以及是否可以使用其他方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句