2013-07-01 98 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