有没有办法从扩展的 TreeItem 直接访问子方法(无需强制转换)?

Is there a way to access a child method directly (without casting) from an extended TreeItem?

我试图尽可能减少我的代码来说明我的问题。所以...

此代码不“做”任何事情。我的意思是问是否有可能在下面的例子中不使用转换就可以访问方法needsCasting() ?

这肯定与编译器“看到”的内容有关,对他来说 CustomTreeItem 和它的父 TreeItem<Dummy> 之间的区别是什么。

我的研究结果是,TreeItem class 中的 'hidden' 列表子项属于 TreeItem<Dummy>,而不是 CustomTreeItem ,但我的问题仍然存在: “有没有办法直接访问子方法(无需转换)?”

例子来了:

import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableRow;

public class CastingQuestion {

    public class Dummy extends TreeTableRow<Dummy> {

    }

    public final class CustomTreeItem extends TreeItem<Dummy> {

        private void needsCasting() {
            System.out.println("Hello world");
        }

        public void listChildren() {
            for (TreeItem<Dummy> item : getChildren()) {
                ((CustomTreeItem) item).needsCasting();
            }
        }
    }
}

注意:调用子classes的方法是违反OOP的。

你问题的答案是。父 classes 不知道您的子 class 方法。

如果您有一个类型为 TreeItem<Dummy> 的变量,您必须先将其转换为 CustomTreeItem,才能访问特定于 CustomTreeItem 的方法或 属性 ] 目的。这是因为编译器只知道变量是 TreeItem<Dummy> 类型,不一定是 CustomTreeItem.

假设我有两个 classes,TreeItemATreeItemB - 都是 TreeItem<Dummy> 的子classes(扩展)。我有一个 TreeItem<Dummy>.

类型的变量
TreeItem<Dummy> item;

此变量可以是 TreeItemATreeItemB:

的实例
item = new TreeItemA(); //valid assignment
item = new TreeItemB(); //valid assignment

因此,如果不向下转换为子class,则只能访问基 TreeItem class 中变量的属性或方法 - 全部取决于您使用的变量类型。

编辑:值得注意的是,您在 CustomTreeItem returns ObservableList<TreeItem<T>> 中调用的 getChildren() 方法(根据默认 TreeItem 实现)。这意味着当您遍历从 getChildren() 返回的列表时,每个元素的类型都是 TreeItem<Dummy>.