Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Spring 3升级到Spring 4后,HibernateTemplate出现不兼容类型错误_Java_Spring_Hibernate - Fatal编程技术网

Java 从Spring 3升级到Spring 4后,HibernateTemplate出现不兼容类型错误

Java 从Spring 3升级到Spring 4后,HibernateTemplate出现不兼容类型错误,java,spring,hibernate,Java,Spring,Hibernate,我正在尝试升级一个应用程序以使用最新版本的Spring。它目前使用Spring3.0.7和Hibernate3.5.6。我能够成功地将其升级到Spring 3.2.8,但如果我将其升级到Spring 4,则会出现如下编译错误: [ERROR] /Users/mraible/dev/foo-upgrades/foo-core/src/main/java/com/company/foo/dao/companydb/impl/hibernate/InFaxDAOImpl.java:[71,82] in

我正在尝试升级一个应用程序以使用最新版本的Spring。它目前使用Spring3.0.7和Hibernate3.5.6。我能够成功地将其升级到Spring 3.2.8,但如果我将其升级到Spring 4,则会出现如下编译错误:

[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);
[ERROR]/Users/mraible/dev/foo upgrades/foo core/src/main/java/com/company/foo/dao/companydb/impl/hibernate/InFaxDAOImpl.java:[71,82]不兼容类型
[错误]必需:java.util.List
找到[错误]:java.util.List
方法调用如下所示:

[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 faxPages=getHibernateTemplate().findByNamedQueryAndNamedParam(queryName,hqlParams,value);
我可以通过强制转换为列表类型来修复编译错误,但这似乎不正确

List<FaxPage> faxPages = (List<FaxPage>) getHibernateTemplate().findByNamedQueryAndNamedParam(queryName, hqlParams, values);
List faxPages=(List)getHibernateTemplate().findByNamedQueryAndNamedParam(queryName,hqlParams,value);

Spring 4的哪些方面破坏了HibernateDataOSupport,因此它不能向后兼容?

这是因为Spring框架用于返回原始列表声明,而该原始列表声明基本上允许您声明所需的任何类型。如果您这样做,编译器将发出一个警告,该警告可以通过
@SuppressWarnings(“unchecked”)
声明“忽略”

虽然可以为此提供向后兼容性,但许多参考文献建议不要在“新代码”中使用原始列表

引用

只允许使用原始类型作为对遗留代码兼容性的让步。强烈反对在Java编程语言中引入泛型之后编写的代码中使用原始类型。Java编程语言的未来版本可能会禁止使用原始类型

这是对那件事的一个很好的总结


虽然我可以肯定地理解您过去能够做的事情的好处,但我建议您像以前那样更新代码,是的:您以前做过隐式转换。

哪个版本的Spring 4?Spring 4中HibernateTemplate中的返回类型与Spring 4.0.2中解决的返回类型有关。我使用的是Spring 4.0.3。您的原始代码可能在某个地方有一个
@SuppressWarnings(“unchecked”)
,因为原始返回类型是原始
列表。原始列表的“优点”是允许您构建这样的构造,它只会导致编译器警告。您必须知道的隐式强制转换是因为签名现在是
List
。我同意这是不幸的,但保留原始列表也不是一个好的选择。你是对的,Stéphane-方法上有@SuppressWarnings(“未选中”)。建议的重构是使用casting吗?如果您有Mockito mock,只需添加
Mockito即可。