- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道这个问题已经被问得令人作呕;我想我已经理解了这个错误,但仍然不明白为什么我(试图)违反删除限制。我还认为我正在以正确的方式使用泛型,如果没有,请随时告诉我。
我有一个 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/
我是一名优秀的程序员,十分优秀!