JavaFX ObservableList存储子类对象丢失子类属性问题求助
解决ObservableList存储子类对象后无法访问子类专属属性的问题
问题根源
- 父类引用的限制:
ObservableList<SuperClass>里的元素会被向上转型为SuperClass类型,父类引用不能直接调用子类专属的方法/属性,必须先转回子类类型才能访问。 - 错误的addToList逻辑:你之前写的
addToList方法完全搞错了——它没有把传入的子类实例添加到列表,反而去修改列表最后一个元素的属性,这直接导致你存入的对象根本不是你初始化的那个,自然拿不到正确的subAttributeA值。
解决方法
1. 修正ListClass的addToList方法
直接把传入的子类实例添加到列表即可,不需要多余的属性复制操作——你初始化的SubClassA已经带了正确的subAttributeA值,直接存就行:
public 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; } }
2. 访问子类属性时先判断类型再转型
从列表取元素后,先用instanceof判断它的实际子类类型,转型后再调用对应的getter方法:
// 获取列表第一个元素 SuperClass element = ListClass.getList().getFirst(); if (element instanceof SubClassA) { // 强制转型为SubClassA SubClassA subA = (SubClassA) element; System.out.println(subA.getSubAttributeA()); // 现在能正确输出1234了 } else if (element instanceof SubClassB) { // 处理SubClassB的情况 SubClassB subB = (SubClassB) element; System.out.println(subB.getSubAttributeB()); }
额外说明
因为作业要求不能修改类结构,没法通过父类定义抽象方法或者泛型来简化操作,所以类型判断+强制转型是当前唯一可行的方案。另外要注意,转型前一定要用instanceof做校验,避免出现ClassCastException。
内容的提问来源于stack exchange,提问作者bjon
相关产品推荐
相关产品推荐

