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

时间:2014-09-02 00:11:51

标签: java generics reflection javafx observablelist

我有一个通用类型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只返回泛型类型&#34; E&#34;而不是它在运行时的类型。

CHILDITEM类型可以是目标,目标,策略或任务。我想知道它在运行时它是什么。

1 个答案:

答案 0 :(得分:0)

正如@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());