[英]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.