Java 从超类继承ArrayList属性,但在子类中为其指定不同的类型

Java 从超类继承ArrayList属性,但在子类中为其指定不同的类型,java,generics,inheritance,Java,Generics,Inheritance,我有一个超类a,它有一个受保护的ArrayList contentList。我有从A继承的B类和C类 B和C中的每一个都使用不同类型的ArrayList在其构造函数中初始化contentList class B extends A { public B (ArrayList<BContent> content) { contentList = content; } ... } class C extends A { public C

我有一个超类a,它有一个受保护的
ArrayList contentList
。我有从A继承的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;
    }
...
}
B类扩展了A类
{
公共B(ArrayList内容)
{
contentList=内容;
}
...
}
C类扩展了
{
公共C(ArrayList内容)
{
contentList=内容;
}
...
}
对象中的
b内容
c内容
和数据结构子类

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

我来自Objective-C背景,由于动态类型解析,这是可能的。如何在Java中实现这一点

干杯
AF

您可以使用泛型

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

class B extends A<BContent> {
    ...
}
A类{
受保护的列表内容;
}
B类扩展了A类{
...
}
这意味着
A
可以使用不同的可能类型(
T
)作为其内容
A
保留
b内容
,而
A
保留
c内容

即使
b内容
对象
数组列表
也不是
数组列表

但你能做的是

public B (ArrayList<BContent> content)
{
    contentList = new ArrayList<>(content);
}
public B(ArrayList内容)
{
contentList=新的ArrayList(内容);
}

通过这种方式,您可以使用
内容的所有元素创建一个新的
数组列表
,您可以在成员声明中使用绑定的类型:

protected ArrayList<? extends Object> contentList;

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

public class A<T> {
    protected List<T> contentList;
}
公共A类{
受保护列表内容列表;
}
然后可以使用具体类型对其进行扩展

public class B extends A<BContent> {
    public B (List<BContent> content) {
        contentList = content;
    }
    ...
公共类B扩展了{
公共B(列表内容){
contentList=内容;
}
...

顺便说一句,传递
ArrayList
通常是个坏主意…使用更通用的
列表来代替。

非常感谢这确实解决了我的问题。最后我明白了泛型的含义:)编译器阻止这样的赋值,因为它不是类型安全的。如果编译器允许像
List contentList=new Ar这样的赋值rayList()
传递它会导致任何对象都可以添加到实际上是CContent集合的contentList中。