2012-05-22 25 views
5

我想有仿函數類是這樣的:通用函數子類在Java中

public class Functor<T, R> { 
    public R invoke(T a) { ... } 
} 

而另一級爲2個參數:

public class Functor<T1, T2, R> { 
    public R invoke(T1 a, T2 b) { ... } 
} 

等。

在C#中我可以這樣寫:

class Functor<T> { ... } 
class Functor<T1, T2> { ... } 

但在Java中這將是一個錯誤:

The type Functor is already defined 

什麼是Java進行多參數的泛型類的最佳實踐?

+0

不是您的問題的答案 - 但是您是否知道http://functionaljava.org/這樣的庫,它可以爲您提供一套開箱即用的函子以及圍繞它們構建的豐富庫? – henry

回答

5

由於仿製藥在Java中通過擦除類型的信息來實現(在class C<T>T消失在編譯的.class文件)沒有辦法讓編譯器知道你在運行時談論什麼課。

如果您定義了F<T1>F<T1,T2>並加載它們,某些類C無法識別它想使用的那個。

這是漫長的說法,我不認爲你可以在Java中做到這一點。 :\

什麼,你可能想要做的僅僅是有一個參數仿函數F<T>T爲對象,Pair<T1, T2>對象,ThreeTuple<T1, T2, T3>等斯卡拉做到這一點。

+1

謝謝!以及在Java中的多參數泛型類的最佳做法是什麼? – user1312837

+0

我剛剛編輯了包含它的答案。簡而言之,在F 中T成爲一個參數類型,它保存1或2或3 ... N類型的輸入。例如,F >。 – Sam

+0

@sam - 格式化提示:您可以使用反引號(\)來附帶內聯代碼格式,因此您不必擔心使用<等。這適用於帖子和評論。 Oh和+1 –

0

你爲什麼稱它爲仿函數?如果您在維基百科中查看仿函數的定義,您會發現這是一個錯誤的術語。

在斯卡拉這被稱爲函數;由於jvm和字節碼的具體情況,有很多版本,具體取決於:Function0<Res>, Function1<T1, Res>, Function2<T1,T2, Res>等,最大爲Function22

+1

不回答這個問題 - 應該是一個評論。 –