2014-07-11 124 views
2

我有一個類定義如下:Java泛型 - 類型不匹配錯誤

public class MultiFacilitySearchDataProvider <T extends Facility & MilepostValue & Copyable<T>> 

類有這個方法:

protected T getFacility(final FacilityInstance instance) { 
    final MultiFacilitySearchDAO dao = new MultiFacilitySearchDAO(instance); 
    ENM.execute(dao); 
    return dao.getResultModel(); // Compile error here 
} 

上述所謂的DAO方法是這樣的:

public MultiFacilitySearchModel getResultModel() { 
    return resultModel; 
} 

而MultiFacilitySearchModel定義如下:

public class MultiFacilitySearchModel implements Copyable<MultiFacilitySearchModel>, Facility, 
Serializable, MilepostValue, MenuDisplayValues 

的問題是,該線返回dao.getResultModel()將產生一個編譯錯誤「類型不匹配:不能從MultiFacilitySearchModel轉換到T」。我不明白爲什麼我得到這個錯誤,因爲MultiFacilitySearchModel實現了爲泛型類型T指定的三個接口。我錯過了什麼?

回答

1

您可以指定任何滿足前綴作爲類型參數的類。因此T不必是超類型MultiFacilitySearchModel。這意味着,然而,

return dao.getResultModel() 

可能不會返回類型的對象,延伸T。 Java不允許你這樣做。

1

該方法MultiFacilitySearchDAO.getResultModel()沒有通用類型,將通用返回MultiFacilitySearchModel而不是T

雖然MultiFacilitySearchModel可以在延伸MultiFacilitySearchDataProvider的某些類中用作T

0

在你的類MultiFacilitySearchDAO你有方法

public MultiFacilitySearchModel getResultModel() 

這顯然是返回的MultiFacilitySearchModel一個實例。這裏沒有什麼通用的。返回類型已修復。

你在另一方面MultiFacilitySearchDataProvider類聲明的方法

protected T getFacility(final FacilityInstance instance) 

類型變量T被約束以實現三個接口Facility & MilepostValue & Copyable。這比MultiFacilitySearchModel少得多。

我可以很容易地創建一個類

public MyFacilitySearchModel implements Copyable<MyFacilitySearchModel>, Facility, MilepostValue 

然後使用getResultModel()一個

MultiFacilitySearchDataProvider<MyFacilitySearchModel> 

結果的類型仍然是MultiFacilitySearchModel不能強制轉換爲MyFacilitySearchModel

也許你的DAO類也應該是通用的。或者聲明方法爲

protected MultiFacilitySearchModel getFacility(final FacilityInstance instance)