- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用带有 JavaFX ListView 的接口(interface),以允许在应用程序中的不同点的列表中显示多种对象类型(不同 GUI 屏幕上的不同对象类型。我已在 JavaFX Controller 中定义了 ListView类为:
@FXML private static ListView<? extends ListDisplayObj> lvLeftBarItems;
和ListDisplayObj
是一个简单的界面:
public interface ListDisplayObj
{
public String getListDisplayString();
}
我有一个数据库级方法,它获取要根据给定键显示的对象列表 - 该方法定义为:
public ObservableList<? extends ListDisplayObj> getListObjectsForKey(String selectedKey)
{
...
}
稍后在 Controller 事件处理程序(或initialize()方法)中,我尝试使用 ObservableList 初始化 ListView,如下所示:
ObservableList<? extends ListDisplayObj> ol = MyObjectManager.getListObjectsForKey(selectedKey);
lvLeftBarItems.setItems(ol);
lvLeftBarItems.setItems(ol)
调用会生成以下编译器错误(在 Netbeans 中)::
incompatible types: ObservableList<CAP#1> cannot be converted to ObservableList<CAP#2>
where CAP#1,CAP#2 are fresh type-variables:
CAP#1 extends ListDisplayObj from capture of ? extends ListDisplayObj
CAP#2 extends ListDisplayObj from capture of ? extends ListDisplayObj
有什么建议吗?我不知道如何解决这个问题。我尝试过使用原始对象(实现 ListDisplayObj)而不是 <? extends ListDisplayObj>
的变体,刚刚返回<ListDisplayObj>
与 <? extends ListDisplayObj>
等等,但没有运气。
最佳答案
当您有一个元素类型为 X 的列表时,您可以存储类型为 X 或 X 的子类的任何对象。
ListView<? extends ListDisplayObj> lvLeftBarItems;
这个声明意味着lvLeftBarItems
是一个ListView
,其内容是ListDisplayObj
的一些未指定的子类,让我们将其命名为CAP#1(我知道它不是一个有效的类名,但为了示例目的让我们传递它)。
您正尝试添加一个元素,其类型在技术上也是 ListDisplayObj
的未指定子类,但我们将其命名为 CAP#2。
现在假设 CAP#1 扩展了 ListDisplayObj 且 CAP#2 扩展了 ListDisplayObj ,因此很明显您不能将 CAP#1 的实例强制转换为 CAP#2 ,反之亦然,因此您不能强制转换CAP#1 列表到 CAP#2 列表,这正是编译器说“ObservableList 无法转换为 ObservableList”时的含义 - 这些列表具有不同的不兼容类型,因为列表项具有不同的不兼容类型.
对于您的代码,只需将 lvLeftBarItems
的声明替换为非通配符泛型即可:
ListView<ListDisplayObj> lvLeftBarItems;
关于java - 使用 Java 泛型接口(interface)与 JavaFX 集合的编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22799393/
我是一名优秀的程序员,十分优秀!