我有一个受保护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;
}
...
}
BCOntent
和CContent
以及来自Object的数据结构子类。
编译器抱怨这不被接受,我必须将contentList
的声明类型从ArrayList<Object>
更改为ArrayList<BCOntent>
或ArrayList<CCOntent>
我来自Objective-C背景,由于动态类型分辨率,这是可能的。我怎样才能在Java中实现这一目标?
干杯 AF
答案 0 :(得分:2)
您可以使用泛型。
class A<T> {
protected List<T> content;
}
class B extends A<BContent> {
...
}
这意味着A
可以使用不同的可能类型(T
)作为其内容。 A<BContent>
持有BContent
,A<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
。