我知道这个问题曾被恶心地问过;我认为我对错误有所了解,但仍然看不到为什么我(尝试)违反了擦除限制。我还认为我以正确的方式使用了泛型,如果没有,请随时告诉我。

我有一个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

09-11 03:52