首页 > 解决方案 > 子类的重写 getter 中的向下转换列表返回类型

问题描述

我有以下类层次结构:

public class U {};
public class IU extends U {};

public class A {
    private final List<? extends U> us;

    public A(Collection<? extends U> us) { 
        this.us = new ArrayList<>(us);
    }

    public List<? extends U> getUs() { return this.us; }
}

public class B extends A {
    public B(Collection<IU> ius) { super(ius); }

    @Override
    public List<IU> getUs() { return (List<IU>) super.getUs(); }
}

列表永远不会被构造修改,A.us我知道getUs()from只会在从类型对象调用时A返回List包含(除非有人做了一些非常混乱的事情,我在这里并不真正打扰)。IUB

演员B.getUs被标记为不安全,所以我的问题是:

标签: javadowncast

解决方案


由于A是一个类型容器,因此包含的类型对于每个A(最终)定义都应该是显式的。

然后,只需更改:

public class U {};
public class IU extends U {};

public class A<T extends U> {
    private final List<T> us;

    public A(Collection<T> us) {
        this.us = new ArrayList<>(us);
    }

    public List<T> getUs() { return this.us; }
}

public class B extends A<IU> {
    public B(Collection<IU> ius) { super(ius); }

    @Override
    public List<IU> getUs() { return super.getUs(); }
}

现在,A适用于您想要的每种类型,并且在编译时强制执行正确的类型(没有警告)。


推荐阅读