Java泛型 - 类型不匹配错误

时间:2014-07-11 16:24:17

标签: java generics

我的课程定义如下:

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指定的三个接口。我缺少什么?

3 个答案:

答案 0 :(得分:1)

您可以将满足prequesites的任何类指定为类型参数。因此T不一定是MultiFacilitySearchModel的超类型。那意味着,

return dao.getResultModel()

可能不会返回扩展T的类型的对象。 Java不允许你这样做。

答案 1 :(得分:1)

方法MultiFacilitySearchDAO.getResultModel()没有通用类型,并且始终会返回MultiFacilitySearchModel而不是T

虽然MultiFacilitySearchModel可以在T的某个类中用作MultiFacilitySearchDataProvider

答案 2 :(得分: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

然后使用

MultiFacilitySearchDataProvider<MyFacilitySearchModel>

getResultModel()的结果类型仍为MultiFacilitySearchModel,无法投放到MyFacilitySearchModel

也许你的DAO类也应该是通用的。或者将方法声明为

protected MultiFacilitySearchModel getFacility(final FacilityInstance instance)