2014-10-30 54 views
1

我想創建一個獲得類的參數的函數,返回T的情況下,如何聲明泛型方法在Java中

所以我有這樣的簽名:

public <T> T foo(Class<T> clazz) {} 

現在,假設我想限制Class<T>並只接受<T extends Command>,所以我想這:

public <T> T foo(Class<T extends Command> clazz) {} 

但是,我Command類也是模板如下:Command<S extends ModuleContex>

所以我試試這個:

public <T> T foo(Class<T extends Command<S extends ModuleContext>> clazz) {} 

但是,這並不編譯!

如何正確寫入?

+0

(在Java中調用泛型。) – 2014-10-30 01:27:52

+1

嗯,這是如果你想有一個[ 「泛型方法」(http://docs.oracle.com/javase/tutorial/extra/generics/methods.html) Google來幫助你。 – markspace 2014-10-30 01:28:44

回答

6

界泛型類或方法的類型參數去的類型參數,而不是類型參數的用途:

public <T extends Command> T foo(Class<T> clazz) {} 

如果命令本身也是通用的,你可以這樣做:

public <S, T extends Command<S>> T foo(Class<T> clazz) {} 

,如果你想要把一個約束的S,你也可以這樣做:

public <S extends ModuleContext, T extends Command<S>> T foo(Class<T> clazz) {} 
+0

我想他們是說'Command'本身就是通用的。你如何得到一個泛型類型的''類實例,參數與參考本身一樣? – 2014-10-30 01:32:58

+0

只是好奇:爲什麼你會選擇你的第三個例子,我的答案?有區別嗎? – markspace 2014-10-30 01:36:58

+0

對於第三個答案 - Eclipse給出了一個警告:「類型參數T隱藏類型T」 – Shvalb 2014-10-30 01:43:03

4

這對於編譯我。我不是100%確定它是正確的,你應該用你使用的實際類型來確定它的工作原理。

public class GenericMethodTest 
{ 
    public static class SomeCommand<X> {} 
    public static class SomeModule {} 
    public <T extends SomeCommand<? extends SomeModule>> T getSomething(Class<T> type) { 
     return null; 
    } 
} 
+0

不錯!它編譯完美!非常感謝! ,但我看到另一個我更喜歡的答案 - 下一個考慮'S'的答案。 – Shvalb 2014-10-30 01:37:28