从超类继承ArrayList属性,但在子类中为其分配不同的类型

时间:2015-09-16 09:11:58

标签: java generics inheritance

我有一个受保护ArrayList<Object> contentList的超类A.我有从B继承的B和C类。

B和C中的每一个在其构造函数中使用不同类型的ArrayList初始化contentList

class B extends A
{
    public B (ArrayList<BContent> content)
    {
        contentList = content;
    }
...
}


class C extends A
{
    public C (ArrayList<CContent> content)
    {
        contentList = content;
    }
...
}

BCOntentCContent以及来自Object的数据结构子类。

编译器抱怨这不被接受,我必须将contentList的声明类型从ArrayList<Object>更改为ArrayList<BCOntent>ArrayList<CCOntent>

我来自Objective-C背景,由于动态类型分辨率,这是可能的。我怎样才能在Java中实现这一目标?

干杯 AF

4 个答案:

答案 0 :(得分:2)

您可以使用泛型。

class A<T> {
    protected List<T> content;
}

class B extends A<BContent> {
    ...
}

这意味着A可以使用不同的可能类型(T)作为其内容。 A<BContent>持有BContentA<CContent>持有CContent

答案 1 :(得分:2)

即使ArrayList<BContent>ArrayList<Object>BContent也不是Object

但你可以做的是,

public B (ArrayList<BContent> content)
{
    contentList = new ArrayList<>(content);
}

这样您就可以创建一个包含ArrayList<Object>

所有元素的新content

答案 2 :(得分:2)

您可以在成员声明中使用绑定类型:

protected ArrayList<? extends Object> contentList;

您不必更改构造函数。

答案 3 :(得分:2)

如果在超类中使用泛型类型

public class A<T> {
    protected List<T> contentList;
}

然后你可以使用具体类型扩展它

public class B extends A<BContent> {
    public B (List<BContent> content) {
        contentList = content;
    }
    ...
顺便说一句,传递ArrayList通常是一个坏主意......请使用更通用的List