我有一个泛型类型为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());