扩展TreeItem后是否可无需强制转换直接访问子节点的自定义方法
核心方案
两种常用方案可以避免在业务逻辑中手动编写强制类型转换代码,如下:
方案1:封装自定义子节点获取方法
由于TreeItem的getChildren()是final方法,无法重写修改返回类型,你可以在CustomTreeItem中封装一层类型转换逻辑,对外直接暴露返回CustomTreeItem类型的子节点列表:
import javafx.collections.FXCollections; import javafx.collections.ObservableList; import java.util.stream.Collectors; // 其余类逻辑不变,仅修改CustomTreeItem部分 public final class CustomTreeItem extends TreeItem<Dummy> { private void needsCasting() { System.out.println("Hello world"); } // 新增自定义方法,封装类型转换逻辑 public ObservableList<CustomTreeItem> getCustomChildren() { return getChildren().stream() // 如果你能保证所有子节点都是CustomTreeItem,直接转换即可 .map(CustomTreeItem.class::cast) .collect(Collectors.toCollection(FXCollections::observableArrayList)); } public void listChildren() { // 业务代码无需强转,直接调用自定义方法即可 for (CustomTreeItem item : getCustomChildren()) { item.needsCasting(); } } }
方案2:使用Java 16+ instanceof模式匹配
如果你使用Java 16及以上版本,可以用模式匹配语法省略显式强转的代码:
public void listChildren() { for (TreeItem<Dummy> item : getChildren()) { // 匹配成功后直接生成对应类型的变量,无需手动写强转语法 if (item instanceof CustomTreeItem customItem) { customItem.needsCasting(); } } }
补充说明
Java是静态类型语言,TreeItem类的getChildren()返回值类型在编译期就固定为ObservableList<TreeItem<Dummy>>,编译器默认只能识别父类TreeItem的方法,因此本质上还是需要类型转换告知编译器实际的子节点类型,上述方案只是把强转逻辑封装或者用语法糖省略了手动写强转代码的步骤。
内容的提问来源于stack exchange,提问作者Daric
相关产品推荐
相关产品推荐

