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

标签 java generics neo4j-ogm

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

我有一个 AbstractService 类(用于 Neo4j OGM 和 Hibernate 实现),每个类都由几个类扩展,这些类包含一些反射(reflect)各个实体对象的方法。各个实体对象都扩展了 DomainEntity,并且都是 Hibernate ORM 和 Neo4j OGM 实体。

我有两个代码片段(一个使用 Hibernate,另一个使用 Neo4j OGM)。两个方法调用(对第 3 方库)具有(几乎)相同的签名,并且我的方法具有相同的签名,但我的 OGM 代码会引发上述编译时错误,而我的 Hibernate 代码则不会。

留言

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 > T queryForObject(Class< T > objectType, String cypher, Map< String,? > parameters)

我在 return session.queryForObject(...) 行上收到以下编译时错误:

incompatible types: DomainEntity cannot be converted to T where T is a type-variable: T extends DomainEntity declared in class AbstractService

但是,如果我在返回之前将响应转换为 T ,它就会起作用,但我不明白为什么。 queryForObject 方法返回 T,这就是我想要返回的内容,所以我不明白为什么在返回之前需要将其转换为 T

编辑我尝试将泛型类型添加到方法调用中:

return session.<T>queryForObject(getEntityType(), query, Collections.EMPTY_MAP);

这不会改变任何事情。

<小时/>

hibernate

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 < R > NativeQuery< R > createNativeQuery(String sqlString, Class< R > resultClass)

public R getSingleResult()

getSingleResult() 和 queryForObject(...) 方法签名之间的唯一区别是 queryForObject(...) 方法签名具有附加的 < T > ,我认为这对返回类型没有影响...?

最佳答案

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

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

我无法确切地说出为什么可以解决这个问题。但这一定与queryForObject()有关。想要通用 map ( Map<String, ?> ) 而 Collections.EMPTY_MAP被声明为原始(非通用)Map .

关于java - 泛型 - 无法转换为 T,其中 T 是类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39340097/

相关文章:

java - 如何在 MapBox Android SDK 上使用 FitBounds?

c# - 了解 Java/C# 中的抽象和接口(interface)

java - 当您可以只使用具体类型时,为什么会有带有上限的通配符?

neo4j - 我如何保证在交易中的两个现有节点之间只创建一个新的唯一节点

java - 将 neo4j ogm 查询结果映射到 java 对象

java - 非法选项: -cacerts for keytool in gitlab-ci with gradle:jdk8

java - 通过 JNI (Android NDK) 将对象 (DisplayMetrics) 从 C 传递到 Java

java - Java 泛型 super

class - Typescript 访问泛型类型的静态属性