2016-09-06 163 views
1

我知道這個問題已被詢問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>,我認爲在返回類型中沒有區別...?

+0

是你的問題是這樣的? http://stackoverflow.com/questions/163382/type-mismatch-for-class-generics –

+0

可能......但在這個答案中,它基本上描述了爲什麼你不能在對象層次結構中分配,我不知道我想我正在努力去做。我只是試圖返回T,這是queryForObject方法的返回類型。 – Brooks

+0

只是瘋狂的猜測,它不會幫助使用'Collections.emptyMap()'而不是'Collections.EMPTY_MAP'?前者使用泛型。 –

回答

2

我可以重現你的錯誤。我可以消除它:

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

我不能確切地告訴爲什麼這解決了它。但它必須有一個事實,queryForObject()想要一個通用映射(Map<String, ?>),而Collections.EMPTY_MAP被宣佈爲原始(非通用)Map

相關問題