簡體   English   中英

使用Java泛型和JavaFX Collection的編譯器錯誤

[英]Compiler error using Java generics Interface with JavaFX Collection

我正在嘗試將接口與JavaFX ListView一起使用,以允許多個對象類型顯示在列表中的應用程序的不同位置(不同GUI屏幕上的不同對象類型。我在JavaFX控制器類中將ListView定義為:

@FXML private static ListView<? extends ListDisplayObj> lvLeftBarItems;

ListDisplayObj是一個簡單的界面:

public interface ListDisplayObj
{
    public String getListDisplayString();
}

我有一個數據庫級方法,該方法基於給定鍵獲取要顯示的對象列表-該方法定義為:

public ObservableList<? extends ListDisplayObj> getListObjectsForKey(String selectedKey)
{
    ...
}

稍后在控制器事件處理程序(或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> <? extends ListDisplayObj> ,只返回<ListDisplayObj> vs <? extends 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:通過通配符參數化類型的引用變量可訪問/不可訪問哪些方法和字段,以獲取更詳細的說明。

對於您的代碼,只需將lvLeftBarItems的聲明替換為非通配符泛型即可:

ListView<ListDisplayObj> lvLeftBarItems;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM