2013-07-01 110 views
0

JPA具有以下簽名的方法:Java類型參數類參數

<T> CriteriaQuery<T> createQuery(Class<T> resultClass); 

如何調用該方法時,我resultClass類型本身,類型參數?

例如:

public class ResultDto<T> { 
... 
} 

我嘗試以下,但它沒有工作:

createQuery(ResultDto<String>.class); 
+0

現在不能將此類型輸入IDE,但是您是否嘗試過使用'> createQuery(ResultDo.class)'? – akaIDIOT

+0

我的IDE說「不兼容的類型」。 – citress

回答

0

沒有Class實例泛型類型的任何具體實例(如ResultDto<String>ResultDto<Integer>ResultDto<MyObject>,...)。

無論類是否通用,總是隻有一個Class實例代表該類的原始版本。在你的情況下,它是ResultDto.class

+0

我想我明白你在說什麼 - 你正在談論Type Erasure的效果,其中類型約束只在編譯時被應用,泛型類型信息在運行時被刪除,所以只有一個實例可以表示類的原始版本。但是我不明白這是如何阻止我區分ResultDto 和ResultDto ,根據Java編譯器它們是不同的類型。爲了讓其他編譯器感到高興,我必須做一個不受控制的轉換。 – citress

+0

IMO,最終我們可以歸咎於類型擦除。但這裏的直接原因是因爲只有'ResultDto.class'。如果讓編譯器通過傳遞'ResultDto.class'來推斷返回類型,則推斷系統將返回類型推斷爲'CriteriaQuery '。當然不是你想要的。另一方面,如果你想避免通過類似'obj。> createQuery(...)'進行類型推斷,那麼你沒有參數,因爲沒有'ResultDto .class'。 AFAIK,你有兩種選擇,要麼讓班級不是通用的,要麼禁止警告。 –

+0

實際上,假設查詢結果返回列表中,我甚至無法將它從列表轉換爲列表>。所以我唯一的選擇似乎不是使用泛型... – citress

0

您可以使用createQuery(ResultDto.class)

原因是當你要創建ResultDto的對象,你將永遠使用類型參數 爲如 ResultDTo<String> rs = new ResultDTo<String>() 所以這種類型的參數,將在考慮創建<T> CriteriaQuery<T> createQuery(Class<T> resultClass);

+0

我知道我可以使用createQuery(ResultDto.class),只要我創建dto對象爲新的ResultDto ()。這只是(1)如果可能的話,我寧願依賴於JDK編譯時檢查(是不是整點類型參數化?),(2)我想避免必須執行未經檢查的轉換 - 沒有它我將無法編譯。一路上的價值必須轉化爲預期/正確的類型。 – citress

+0

您可以放心地依靠JDK編譯時檢查。例如'公共靜態空隙試驗(T [] ARR){ \t \t爲(T T:ARR){ \t \t \t System.out的。的println(T); '您可以使用Integer []或String []安全地調用方法,現在如果您使用int []調用,它將在編譯時本身失敗。 – user2506840