Java 从超类继承ArrayList属性,但在子类中为其指定不同的类型
我有一个超类a,它有一个受保护的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
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中。