ObservableArrayList:如何通过反射获取泛型类型



我有一个泛型类型为CHILDITEMS的ObservableList,其中<CHILDITEMS extends PlanItem>。在运行时,我怎么知道ObservableList是什么类型的?

    /*Get a reference to the child items of the currently viewed item.*/
    ObservableList<CHILDITEMS> childItems = (ObservableList<CHILDITEMS>) viewing.getChildItems();
    /*Set the child items label to the type of the child items.*/
    childItemsLabel.setText("Name of CHILDITEMS class");

我不能使用getFields,因为CHILDITEMS实际上不是一个字段。在ObservableList.class上使用getType只返回泛型类型"E",而不是运行时的类型。

CHILDITEM类型可以是目标、目标、战略或任务。我想知道在运行时是哪一个。

正如@Romski在评论中所说,这些信息甚至在运行时都不会保留。

如果你知道你的列表不是空的,并且你只在列表中放了确切类型的项目(即你的ObservableList<P>只包含运行时类型P的项目,而不是任何属于P子类实例的项目),那么你当然可以做list.get(0).getClass(),但这是一种不太可能的情况,而且不是很健壮。

您还可以考虑为列表创建一个包装器,使用类型标记来保留类型。类似于:

public class TypedObservableList<P extends PlanItem> {
    private final Class<P> type ;
    private final ObservableList<P> list ;
    public TypedObservableList(Class<P> type) {
        this.type = type ;
        this.list = FXCollections.observableArrayList();
    }
    public Class<P> getType() {
        return type ;
    }
    public ObservableList<P> getList() {
        return list ;
    }
}

现在你会得到很多看起来像的代码

TableView<Goal> goalTable = new TableView<>();
TypedObservableList<Goal> goals = new TypedObservableList<>(Goal.class);
goalTable.setItems(goals.getList());

但至少你现在可以做

TypedObservableList<? extends PlanItem> typedList = viewing.getChildItems();
childItemsLabel.setText(typedList.getType().getSimpleName());

你还没有说viewing是什么,但你也许可以想出一个类似的解决方案,在这个解决方案中,类持有类型令牌,所以你最终会得到

childItemsLabel.setText(viewing.getChildType().getSimpleName());

相关内容

  • 没有找到相关文章

最新更新