JPA具有以下簽名的方法:Java類型參數類參數
<T> CriteriaQuery<T> createQuery(Class<T> resultClass);
如何調用該方法時,我resultClass
類型本身,類型參數?
例如:
public class ResultDto<T> {
...
}
我嘗試以下,但它沒有工作:
createQuery(ResultDto<String>.class);
JPA具有以下簽名的方法:Java類型參數類參數
<T> CriteriaQuery<T> createQuery(Class<T> resultClass);
如何調用該方法時,我resultClass
類型本身,類型參數?
例如:
public class ResultDto<T> {
...
}
我嘗試以下,但它沒有工作:
createQuery(ResultDto<String>.class);
沒有Class
實例泛型類型的任何具體實例(如ResultDto<String>
,ResultDto<Integer>
,ResultDto<MyObject>
,...)。
無論類是否通用,總是隻有一個Class
實例代表該類的原始版本。在你的情況下,它是ResultDto.class
。
我想我明白你在說什麼 - 你正在談論Type Erasure的效果,其中類型約束只在編譯時被應用,泛型類型信息在運行時被刪除,所以只有一個實例可以表示類的原始版本。但是我不明白這是如何阻止我區分ResultDto
IMO,最終我們可以歸咎於類型擦除。但這裏的直接原因是因爲只有'ResultDto.class'。如果讓編譯器通過傳遞'ResultDto.class'來推斷返回類型,則推斷系統將返回類型推斷爲'CriteriaQuery
實際上,假設查詢結果返回列表中,我甚至無法將它從列表
您可以使用createQuery(ResultDto.class)
原因是當你要創建ResultDto的對象,你將永遠使用類型參數 爲如 ResultDTo<String> rs = new ResultDTo<String>()
所以這種類型的參數,將在考慮創建<T> CriteriaQuery<T> createQuery(Class<T> resultClass);
我知道我可以使用createQuery(ResultDto.class),只要我創建dto對象爲新的ResultDto
您可以放心地依靠JDK編譯時檢查。例如'公共靜態
現在不能將此類型輸入IDE,但是您是否嘗試過使用'> createQuery(ResultDo.class)'? –
akaIDIOT
我的IDE說「不兼容的類型」。 – citress