我知道这个问题已被问到令人作呕;我想我对错误有所了解,但仍然无法理解为什么我(试图)违反了删除限制。我也认为我正在以正确的方式使用泛型,如果没有,请随时告诉我。
我有一个AbstractService类(对于我的Neo4j OGM和Hibernate实现),每个类都由几个类扩展,这些类包含一些反映单个Entity对象的方法。单个实体对象都扩展了DomainEntity,并且都是Hibernate ORM和Neo4j OGM实体。
我有两个代码片段(一个使用Hibernate,另一个使用Neo4j OGM)。两个方法调用(到第三方库)都有(几乎)相同的签名,我的方法具有相同的签名,但是我的OGM代码抛出了上面的编译时错误,而我的Hibernate代码没有。
OGM
T
这是queryForObject方法调用的签名:
public< T> T queryForObject(Class< T> objectType,String cypher, 地图<串,? >参数)
我在返回session.queryForObject(...)行上得到以下编译时错误:
不兼容的类型:DomainEntity无法转换为T所在的T. 一个类型变量: T扩展了在AbstractService
类中声明的DomainEntity
但是,如果我在回复之前将回复转发给T
,那么它是有效的,我不明白为什么。 queryForObject方法返回T
,这是我想要返回的内容,因此我不理解为什么在返回之前需要将其转换为return session.<T>queryForObject(getEntityType(), query, Collections.EMPTY_MAP);
。
编辑我尝试将泛型类型添加到方法调用:
import org.hibernate.Session;
public abstract class AbstractService<T extends DomainEntity> implements Service<T> {
private Session session;
public T getEntity(String property) {
String query = "SELECT * FROM " + getLabel() + " WHERE " + getUniqueProperty() + " = \'" + property + "\'";
return getSession().createNativeQuery(query, getEntityType()).getSingleResult();
}
@Override
public abstract Class<T> getEntityType();
public abstract String getUniqueProperty();
public abstract String getLabel();
}
这不会改变任何事情。
HIBERNATE
{{1}}
以下是createNativeQuery和getSingleResult方法调用的签名。
public&lt; R> NativeQuery&LT; R> createNativeQuery(String sqlString, 类&LT; R> resultClass)
public R getSingleResult()
getSingleResult()和queryForObject(...)方法签名之间的唯一区别是queryForObject(...)方法签名具有附加&lt; T&gt;,我没想到它在返回类型上有所不同......?
答案 0 :(得分:2)
我可以重现你的错误。我可以消除它:
return session.queryForObject(getEntityType(), query, Collections.emptyMap());
我无法确切地说明为什么这会解决它。但它必须与queryForObject()
想要通用地图(Map<String, ?>
)以及Collections.EMPTY_MAP
被声明为原始(非通用)Map
的事实有关。