java中的通用仿函数类

时间:2012-05-22 04:28:26

标签: java generics functor

我想要像这样的仿函数类:

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

另外两个论点的类:

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中多参数泛型类的最佳实践是什么?

2 个答案:

答案 0 :(得分:5)

因为泛型是通过擦除类型信息在Java中实现的(在class C<T>中,T在编译的.class文件中消失),编译器无法知道你在说什么类在运行时。

如果您定义F<T1>F<T1,T2>并加载它们,则某些类C无法识别它想要使用的那个。

这是很长的路要走,我认为你不能用Java做到这一点。 :\

您可能想要做的只是使用单个参数仿函数F<T>并让T成为对象,Pair<T1, T2>对象,ThreeTuple<T1, T2, T3>等等.Scala会做此

答案 1 :(得分:0)

为什么称它为仿函数?如果你在维基百科中查看了仿函数的定义,你会发现这是一个错误的术语。

在Scala中,这称为Function;由于jvm和字节码的细节,有很多版本,取决于arity:Function0<Res>, Function1<T1, Res>, Function2<T1,T2, Res>等,最多Function22