层次结构和泛型

dawww

在我的应用程序中,我有一个主要基于两个类层次结构的模型:容器和元素。容器通过列表引用了元素。
例如,考虑一个Java类Child,它是的子类型,Parent并且ElementChild是的子类型ElementParent这些元素用作列表的类型参数,我希望每个容器都可以从其列表中添加,删除和获取元素。这些列表应尽可能严格,即应包含放置在相同层次结构(Child- ElementChild)上的元素

我知道List<ElementParent>并且List<ElementChild>不在子类型关系中,是否有比仅创建两个不同的列表(List<ElementParent>inParentList<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 ParentParent::add(ElementParent element)方法,因此它继承到Child

现在您可以编写:

ElementParent ep = ...;
Child child = ...;
child.add(ep); //perfectly legal

但是那会怎么办呢?添加ElementParentElementChilds的列表这就是为什么List<ElementParent>List<ElementChild>不处于子类型关系的原因

那么如何解决您的问题呢?

例如List<ElementParent>通配符可能会有所帮助,而且List<ElementChild>两者都可以List<? extends ElementParent>,您可以ElementParent阅读List<? extends ElementParent>,但很遗憾,您不能在其中写任何东西(除外null)。

与下限类似List<? super ElementChild>,但是在您的位置上,我会重新考虑您要达到的目标以及是否可以使用其他方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java泛型层次结构

来自分类Dev

庞大的Java类层次结构中繁琐的泛型声明

来自分类Dev

使用泛型链接两个层次结构

来自分类Dev

泛型类型如何适合类型层次结构?

来自分类Dev

Kotlin泛型在类层次结构中不匹配

来自分类Dev

泛型和可为空(类与结构)

来自分类Dev

是否可以映射(JPA)在抽象超类中使用泛型的Java类型层次结构?

来自分类Dev

并行类层次结构上下文中的Java泛型问题

来自分类Dev

Java类层次结构中与泛型不兼容的空性约束

来自分类Dev

当参数化类型通过层次结构传递时,在Java中创建泛型类型的实例吗?

来自分类Dev

泛型:如何处理类层次结构中的多个有界类型

来自分类Dev

类层次结构和设置

来自分类Dev

AngularJS和范围层次结构

来自分类Dev

Autofac和泛型

来自分类Dev

泛型和继承?

来自分类Dev

功能和泛型

来自分类Dev

泛型和ClassCastException

来自分类Dev

泛型和Ormlite

来自分类Dev

ThreadLocal和泛型

来自分类Dev

泛型和指针

来自分类Dev

ThreadLocal和泛型

来自分类Dev

泛型与显式类型类/结构

来自分类Dev

对结构类型数组进行泛型排序

来自分类Dev

Amazon DynamoDB和类层次结构

来自分类Dev

UrlClassLoader委托和继承层次结构

来自分类Dev

流程层次结构和名称注册

来自分类Dev

Llinear布局层次结构和对齐问题

来自分类Dev

PostSharp和方面通过层次结构继承

来自分类Dev

Java数据层次结构和行映射