我有一个通用类型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类型可以是目标,目标,策略或任务。我想知道它在运行时它是什么。
答案 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());