gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:48:46 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com