2013-02-28 120 views
1

我想知道是否有办法在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; 
} 

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

+1

出于好奇,为什么你写你自己的'得到()'方法,而不是使用['EntityManager'(http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager。 HTML)? – 2013-02-28 20:50:10

+0

因为我是Hibernate的新手,并不知道EntityManager存在。谢谢你的提示。 :) – 2013-02-28 20:51:13

+0

在这种情况下,我强烈推荐至少浏览Java EE教程的相关部分:http://docs.oracle.com/javaee/6/tutorial/doc/bnbpy.html – 2013-02-28 20:54:24

回答

4

你想获得一个Class<T>在运行时传递给doSomethingElse()No, that is not possible.

如果您描述为什么doSomethingElse需要Class<T>,或许我们可以建议一种解决方法。

+0

我正在编写实用程序方法与休眠。下面是我实际尝试做的一个例子,你可以推断它是如何应用于这个问题的:https://gist.github.com/blakeman8192/de57273f472ceaf1b7d8 – 2013-02-28 20:42:24

+1

是的,这是不可能的。这就是为什么'Session#get()'首先需要'Class '。 – 2013-02-28 20:44:12

2

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

另请注意,(T)将被标记为未选中向下。