从Java中的泛型类获取类实例

时间:2012-08-20 14:40:00

标签: java generics

我有一种方法可以传递一个泛型参数。要执行一个必需的方法,我需要相同的类实例。我怎么才能得到它。 我正在使用一种解决方法,但我想知道如何获取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相同。

4 个答案:

答案 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)

泛型更多用于编译时类型安全 - 您需要类实例,因此编译器不会抱怨丢失强制转换。或者你可以完全抛弃泛型并投射结果