【问题标题】:Why JavaFX TableView#setItems takes ObservableList<T> and not ObservableList<? extends T>?为什么 JavaFX TableView#setItems 采用 ObservableList<T> 而不是 ObservableList<?扩展 T>?
【发布时间】:2018-01-27 20:07:39
【问题描述】:

我想知道为什么TableView&lt;T&gt; 方法setItems 不以ObservableList&lt;? extends T&gt; 作为参数,而是ObservableList&lt;T&gt;

还有什么是将ObservableList&lt;? extends T&gt; 转换为ObservableList&lt;T&gt; 的最佳方法。我可以将第一个列表中的所有元素添加到第二个列表中,然后添加侦听器以收听更改,但我想知道也许有更好的方法。

【问题讨论】:

  • 你的问题不是很清楚。您应该发布代码。
  • 它会阻止您通过table.getItems().add(...) 将项目添加到表中(您需要什么参数类型?)。因此,这将迫使程序员必须保留对列表的单独引用。这在某些情况下会很不方便。有什么好处?
  • 也许如果您想将表的后备列表更改为不同类型的列表,最好完全替换表,即使类型相关。
  • 你可以尝试使用继承=>ObjA,ObjB extends ObjA。创建TableView&lt;ObjA&gt;,然后创建ObservableList&lt;ObsA&gt; list 并将ObjAObjA 对象添加到此列表中。 => table.getItems().add(list).
  • 如果您确定永远不会使用TableView.getItems() 返回的列表写入到列表中(可能会导致在James_D 写的列表)最有效的方法是将您的 ObservableList&lt;? extends T&gt; 简单地转换为原始类型。但是,如果您想使用ObservableList&lt;E&gt; 其中E extends TTableView,为什么不简单地使用TableView&lt;E&gt;???

标签: java list generics javafx tableview


【解决方案1】:

只是总结一下cmets:

TableView&lt;T&gt; 方法 setItems 不将 ObservableList&lt;? extends T&gt; 作为参数,而是 ObservableList&lt;T&gt; 的原因是您可以使用 TableView.getItems().add(...) 将项目添加到列表中

但是,如果您确定永远不会使用 TableView.getItems() 返回的列表写入列表,那么最高效的方法是将您的 ObservableList&lt;? extends T&gt; 转换为原始类型 (ObservableList&lt;T&gt;)。

【讨论】:

    猜你喜欢
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2013-10-25
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    相关资源
    最近更新 更多