2012-05-22 24 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

不回答这个问题 - 应该是一个评论。 –