我知道這個問題已被詢問ad nauseam;我想我對錯誤有所瞭解,但仍然無法明白我爲什麼(試圖)違反擦除限制。我也認爲我正確地使用泛型,如果沒有,請隨時告訴我。泛型 - 不能轉換爲T,其中T是一個類型變量
我有一個AbstractService類(用於我的Neo4j OGM和Hibernate實現),每個類都擴展了幾個類,其中包含反映單個實體對象的幾個方法。各個實體對象都擴展了DomainEntity,都是Hibernate ORM和Neo4j OGM實體。我有兩個代碼片段(一個使用Hibernate,另一個使用Neo4j OGM)。這兩個方法調用(對第三方庫)都有(幾乎)相同的簽名,而且我的方法具有相同的簽名,但是我的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方法調用的簽名:
公共< T>ŤqueryForObject(類< T>的objectType,字符串暗號, 地圖<字符串,?>參數)
我上返回以下編譯時錯誤session.queryForObject(...)線:
不兼容的類型:DomainEntity不能轉換到T,其中T是 一個類型的變量: Ť延伸DomainEntity在課堂上聲明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方法調用的簽名。
公共< R> NativeQuery < R> createNativeQuery(字符串的SqlString, 類< R> resultClass)
公共研究getSingleResult()
的getSingleResult之間()的唯一差別和queryForObject(...)方法簽名是queryForObject(...)方法簽名有額外的< T>,我認爲在返回類型中沒有區別...?
是你的問題是這樣的? http://stackoverflow.com/questions/163382/type-mismatch-for-class-generics –
可能......但在這個答案中,它基本上描述了爲什麼你不能在對象層次結構中分配,我不知道我想我正在努力去做。我只是試圖返回T,這是queryForObject方法的返回類型。 – Brooks
只是瘋狂的猜測,它不會幫助使用'Collections.emptyMap()'而不是'Collections.EMPTY_MAP'?前者使用泛型。 –