泛型 - 无法转换为T,其中T是类型变量

时间:2016-09-06 03:12:11

标签: java generics neo4j-ogm

我知道这个问题已被问到令人作呕;我想我对错误有所了解,但仍然无法理解为什么我(试图)违反了删除限制。我也认为我正在以正确的方式使用泛型,如果没有,请随时告诉我。

我有一个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;,我没想到它在返回类型上有所不同......?

1 个答案:

答案 0 :(得分:2)

我可以重现你的错误。我可以消除它:

    return session.queryForObject(getEntityType(), query, Collections.emptyMap());

我无法确切地说明为什么这会解决它。但它必须与queryForObject()想要通用地图(Map<String, ?>)以及Collections.EMPTY_MAP被声明为原始(非通用)Map的事实有关。