【问题标题】:Generic method without type argument没有类型参数的通用方法
【发布时间】:2013-03-01 04:46:30
【问题描述】:

我想知道在 Java 中是否有一种方法可以在泛型方法中使用泛型类型,而无需指定类类型的参数。这是正常的做法:

public <T> T doSomethingGeneric(Class<T> type, int a) {
    return (T) doSomethingElse(type, a);
}

我想要这个作为替代方案:

public <T> T doSomethingGeneric(int a) {
    return (T) doSomethingElse(/* some magic with T here */, a);
}

背景:我正在用 Hibernate 编写实用程序方法。这是我实际尝试做的一个示例,您可以推断它如何应用于此问题。

public static <M extends Model> M get(Class<M> type, Serializable id) {
    Session session = newSession();
    Transaction t = session.beginTransaction();
    Object model = null;
    try {
        model = session.get(type, id);
        t.commit();
    } catch (HibernateException ex) {
        t.rollback();
        throw ex;
    }
    return (M) model;
}

这可能吗?如果是这样,它是如何完成的?谢谢!

【问题讨论】:

  • 出于好奇,您为什么要编写自己的get() 方法而不使用EntityManager
  • 因为我是 Hibernate 的新手,不知道 EntityManager 的存在。谢谢你的提示。 :)
  • 在这种情况下,我强烈建议至少浏览一下 Java EE 教程的相关部分:docs.oracle.com/javaee/6/tutorial/doc/bnbpy.html

标签: java generics


【解决方案1】:

您想在运行时将Class&lt;T&gt; 传递给doSomethingElse()No, that is not possible.

如果您描述了为什么doSomethingElse 需要Class&lt;T&gt;,也许我们可以建议一种解决方法。

【讨论】:

  • 我正在用 Hibernate 编写实用方法。这是我实际尝试做的一个示例,您可以推断它如何应用于此问题:gist.github.com/blakeman8192/de57273f472ceaf1b7d8
  • 是的,这是不可能的。这就是为什么Session#get() 首先需要Class&lt;T&gt;
【解决方案2】:

这是不可能的:doSomethingGeneric 的代码只编译一次,这与 C++ 中模板的实例化不同。 T 类型在此过程中擦除Object

另请注意,(T) 将被标记为未经检查的向下转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多