我知道这个问题曾被恶心地问过;我认为我对错误有所了解,但仍然看不到为什么我(尝试)违反了擦除限制。我还认为我以正确的方式使用了泛型,如果没有,请随时告诉我。
我有一个AbstractService类(用于我的Neo4j OGM和Hibernate实现),每个类都由几个类扩展,这些类包含一些反映单个Entity对象的方法。各个实体对象都扩展了DomainEntity,并且都是Hibernate ORM和Neo4j OGM实体。
我有两个代码段(一个使用Hibernate,另一个使用Neo4j OGM)。 (对第3方库的)两个方法调用都具有(几乎)相同的签名,而我的方法具有相同的签名,但是我的OGM代码抛出上述编译时错误,而我的Hibernate代码则没有。
OGM
import org.neo4j.ogm.session.Session;
import org.neo4j.ogm.transaction.Transaction;
public abstract class AbstractService<T extends DomainEntity> implements Service<T> {
private Session session;
@Override
public abstract Class<T> getEntityType();
public abstract String getUniqueProperty();
public abstract String getLabel();
public T getEntity(String property) {
String query = "MATCH (x:" + getLabel() + ") WHERE x." + getUniqueProperty() + " = \"" + property + "\" RETURN x";
return session.queryForObject(getEntityType(), query, Collections.EMPTY_MAP);
}
}
这是queryForObject方法调用的签名:
public T queryForObject(Class objectType,String cypher,
Map 参数)
我在return session.queryForObject(...)行上收到以下编译时错误:
不兼容的类型:DomainEntity无法转换为T,其中T为
类型变量:
T扩展了在类AbstractService中声明的DomainEntity
但是,如果我在返回之前将响应强制转换为
T
,则它可以正常工作,我不明白为什么。 queryForObject方法返回T
,这是我要返回的内容,因此我不明白为什么在返回之前需要将其强制转换为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();
}
这是createNativeQuery和getSingleResult方法调用的签名。
public NativeQuery createNativeQuery(String sqlString,
Class resultClass)
公共R getSingleResult()
getSingleResult()和queryForObject(...)方法签名之间的唯一区别是queryForObject(...)方法签名具有附加的,我不认为返回类型有所不同... ?
最佳答案
我可以重现您的错误。我可以消除它:
return session.queryForObject(getEntityType(), query, Collections.emptyMap());
我不能确切地说出为什么能解决这个问题。但是必须与以下事实有关:
queryForObject()
需要通用映射(Map<String, ?>
),而Collections.EMPTY_MAP
被声明为原始(非通用)Map
。