我想要像这样的仿函数类:
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中多参数泛型类的最佳实践是什么?
答案 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
。