2013-02-28 85 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)將被標記爲未選中向下。