JavaFX ObservableList<SuperClass>不保留子类属性

问题描述 投票:0回答:1

我有一个 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()); 
java inheritance javafx polymorphism observablelist
1个回答
0
投票

您未显示的代码中可能存在一些错误。

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.