5

我想要这样的仿函数类:

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

4

2 回答 2

5

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

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

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

您可能想要做的只是有一个参数函子F<T>,让我们T成为对象、Pair<T1, T2>对象ThreeTuple<T1, T2, T3>等。Scala 就是这样做的。

于 2012-05-22T04:39:33.957 回答
0

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

在 Scala 中,这称为函数;并且由于 jvm 和字节码的特殊性,有很多版本,取决于 arity:Function0<Res>, Function1<T1, Res>, Function2<T1,T2, Res>等,最多Function22.

于 2012-12-01T23:13:18.810 回答