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