我正在尝试升级一个应用程序以使用最新版本的Spring。它目前使用Spring 3.0.7和Hibernate 3.5.6。我能够成功地将其升级到Spring3.2.8,但如果我将其升级为Spring4,我会遇到如下编译错误:
[ERROR] /Users/mraible/dev/foo-upgrades/foo-core/src/main/java/com/company/foo/dao/companydb/impl/hibernate/InFaxDAOImpl.java:[71,82] incompatible types
[ERROR] required: java.util.List<com.company.foo.common.domain.FaxPage>
[ERROR] found: java.util.List<capture#49 of ?>
方法调用如下所示:
List<FaxPage> faxPages = getHibernateTemplate().findByNamedQueryAndNamedParam(queryName, hqlParams, values);
我可以通过转换为列表类型来修复编译错误,但这似乎不对。
List<FaxPage> faxPages = (List<FaxPage>) getHibernateTemplate().findByNamedQueryAndNamedParam(queryName, hqlParams, values);
Spring 4是什么破坏了Hibernate DaoSupport,使其不向后兼容?
这是因为Spring框架用于返回原始列表声明,而该原始列表声明基本上允许您声明所需的任何类型。如果这样做,编译器将发出一个警告,该警告可以通过@SuppressWarnings("unchecked")
声明"忽略"。
虽然可以提供向后兼容性,但许多参考文献建议永远不要在"新代码"中使用原始列表。
引用Java语言规范
只允许使用原始类型作为对遗留代码兼容性的让步。强烈反对在Java编程语言引入泛型之后编写的代码中使用原始类型。Java编程语言的未来版本可能会禁止使用原始类型。
这条线索很好地概括了这件事。
虽然我可以肯定地理解你过去所能做的事情的好处,但我建议你像以前一样更新你的代码,是的:无论如何,你以前都在做隐式转换。