java - 使用 Java 泛型接口(interface)与 JavaFX 集合的编译器错误

标签 java generics collections interface observablelist

我正在尝试使用带有 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”时的含义 - 这些列表具有不同的不兼容类型,因为列表项具有不同的不兼容类型.

检查GenericsFAQ: Which methods and fields are accessible/inaccessible through a reference variable of a wildcard parameterized type以获得更详细的解释。

对于您的代码,只需将 lvLeftBarItems 的声明替换为非通配符泛型即可:

ListView<ListDisplayObj> lvLeftBarItems;

关于java - 使用 Java 泛型接口(interface)与 JavaFX 集合的编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22799393/

相关文章:

java - 如何在 Java 中将数组转换为集合

c# - 字典列表排序

java - 二叉搜索树 字符串搜索

java - 从单元格值获取单元格索引,Apache POI

java - 将通用 POJO 写入 CSV 转换器

ios - Swift 中的多个泛型类继承

arrays - 在 Swift 中按属性对类或结构数组进行排序的通用函数

java - 移动配置部分

java - 如何访问单独函数中的变量 - Android

java - 在java中搜索Pair