我有一种方法可以传递一个泛型参数。要执行一个必需的方法,我需要相同的类实例。我怎么才能得到它。
我正在使用一种解决方法,但我想知道如何获取Class
实例。
我正在使用的片段是:
public <T> T readModelWithId(Class<T> c, Serializable pk) {
// Some code here.
T t = (T)session.get(c, pk);
// Some code here.
return t;
}
问题在于我不想在此方法中传递Class
实例,因为它与泛型类型的返回类型T
相同。
答案 0 :(得分:3)
你无法在该方法中找到像T.class
这样的东西,所以你必须传递类参数,因为你需要它来从会话中获取你的模型对象。
此外,这增加了一些额外的“类型安全性”。您将强制调用者将返回类型指定为参数,因此返回的类型不仅仅是“调用者可能期望的任何内容”(尽管我同意这会使其变得多余)。
答案 1 :(得分:2)
你不能这样做,因为Java使用&#34;类型擦除&#34;来实现泛型。
http://docs.oracle.com/javase/tutorial/java/generics/erasure.html
看起来你正在做一个通用的DAO。我在这里做了类似的事情:
http://www.matthews-grout.co.uk/2012/01/my-generic-hibernate-dao.html
答案 2 :(得分:0)
对于使用强制类型转换的非泛型,您无法对泛型做任何事情。考虑代码的非泛型版本:
public Object readModelWithId(Class c, Serializable pk) {
// Some code here.
Object t = session.get(c, pk);
// Some code here.
return t;
}
现在问同样的问题,你能摆脱类实例参数c
吗?
答案 3 :(得分:-1)
泛型更多用于编译时类型安全 - 您需要类实例,因此编译器不会抱怨丢失强制转换。或者你可以完全抛弃泛型并投射结果