1

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

4 回答 4

3

您无法T.class在该方法中获得类似的东西,因此您必须传递 class 参数,因为您需要它从会话中获取模型对象。

此外,这增加了一些额外的“类型安全”。您将强制调用者将返回类型指定为参数,因此返回的类型将不仅仅是“调用者可能期望的任何东西”(尽管我同意这使它变得多余)。

于 2012-08-20T14:49:56.623 回答
2

你不能这样做,因为 Java 使用“类型擦除”实现泛型。

http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

看起来你正在做一个通用的 DAO。我在这里做了类似的事情:

http://www.matthews-grout.co.uk/2012/01/my-generic-hibernate-dao.html

于 2012-08-20T14:52:25.547 回答
0

你不能用泛型做任何你不能用强制转换来做非泛型的事情。考虑代码的非通用版本:

public Object readModelWithId(Class c, Serializable pk) {
    // Some code here.
    Object t = session.get(c, pk);
    // Some code here.
    return t;
}

现在问同样的问题,你能摆脱类实例参数c吗?

于 2012-08-20T18:27:58.547 回答
-1

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

于 2012-08-20T14:47:55.250 回答