我有一个 ObservableList
public abstract class SuperClass {
private int superAttribute;
}
public class SubClassA extends SuperClass {
private int subAttributeA;
}
public class SubClassB extends SuperClass {
private int subAttributeB;
}
public class ListClass {
private static ObservableList<SuperClass> list = FXCollections.observableArrayList();
}
在另一个类中,我创建子类对象的实例并将其添加到list
public class SomeClass {
SubClassA subObject = new SubClassA(superAttribute, subAttributeA);
ListClass.addToList(subObject);
}
当我尝试访问 subAttributeA 时,它会作为默认值返回。例如,我创建 subAttributeA 为 1234 的对象,当我尝试访问它时,它是 0。
System.Out.Println(ListClass.list.getFirst().getSubAttributeA())
返回没有任何有用的东西。
有几点需要注意。这是一项作业,所以我对课程的结构没有余地。只能有一个列表包含两个子类。
我尝试在 addToList 方法中将对象转换为其子类型
public static void addToList(SuperClass objectToBeAdded) {
if (objectToBeAdded instanceof SubClassA) {
((SubClassA)list.getLast().setSubAttributeA(((SubClassA) objectToBeAdded).getSubAttributeA());
您未显示的代码中可能存在一些错误。
ObservableLists 可以毫无问题地管理对多态对象的引用。
这是一个工作示例。
输出为:
[SubClassA{subAttributeA=11} SuperClass{superAttribute=1}, SubClassB{subAttributeB=2} SuperClass{superAttribute=22}]
生成它的代码是:
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
public class SuperTester {
public static void main(String[] args) {
ListClass.addToList(new SubClassA(11, 1));
ListClass.addToList(new SubClassB(22, 2));
System.out.println(ListClass.getList());
}
}
abstract class SuperClass {
private int superAttribute;
SuperClass(int superAttribute) {
this.superAttribute = superAttribute;
}
public int getSuperAttribute() {
return superAttribute;
}
@Override
public String toString() {
return "SuperClass{" +
"superAttribute=" + superAttribute +
'}';
}
}
class SubClassA extends SuperClass {
private int subAttributeA;
SubClassA(int subAttributeA, int superAttribute) {
super(superAttribute);
this.subAttributeA = subAttributeA;
}
public int getSubAttributeA() {
return subAttributeA;
}
@Override
public String toString() {
return "SubClassA{" +
"subAttributeA=" + subAttributeA +
"} " + super.toString();
}
}
class SubClassB extends SuperClass {
private int subAttributeB;
SubClassB(int superAttribute, int subAttributeB) {
super(superAttribute);
this.subAttributeB = subAttributeB;
}
public int getSubAttributeB() {
return subAttributeB;
}
@Override
public String toString() {
return "SubClassB{" +
"subAttributeB=" + subAttributeB +
"} " + super.toString();
}
}
class ListClass {
private static ObservableList<SuperClass> list = FXCollections.observableArrayList();
public static void addToList(SuperClass objectToBeAdded) {
list.add(objectToBeAdded);
}
public static ObservableList<SuperClass> getList() {
return list;
}
}