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 では、これは Function と呼ばれます。また、jvm とバイトコードの仕様により、アリティに応じて多くのバージョンがあります:Function0<Res>, Function1<T1, Res>, Function2<T1,T2, Res>など、最大Function22.

于 2012-12-01T23:13:18.810 に答える