我的课程定义如下:
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指定的三个接口。我缺少什么?
答案 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)