質問

相互運用性の場合は、Scala CodeからScalaの部分関数を渡す必要があります。関数(function1など)の場合、匿名型でサブクラス化できる抽象関数がありますが、部分関数のために同じ方法が最も簡単な方法ですか?

この場合は、Javaの「完全な」機能であることが嬉しく思います。

役に立ちましたか?

解決

Twitter utilライブラリを使用できる場合は、これに特別なクラスがあります。 http://twitter.github.com/util/util-core/target/site/doc/main/api/com/twitter/util/Function。HTML これは基本的に抽象区画機能と同じ解決策です。

他のヒント

ここですることは、いくつかの一般的なライブラリ(Scala対応ではない)で、Javaのインタフェースを提供するものです。

//this is Java - in the Java lib
abstract class PartialTransformer<I, O> {
    abstract public boolean isDefinedAt(I i);
    public O transform(I i) {
        if (isDefinedAt(i)) {
            return transform0(i);
        }
        return null;
    }
    abstract protected O transform0(I i);
}
.

その後、Scala (すなわち、上記のJavaライブラリに依存するScalaライブラリ)で、これの実装をPartialFunctionに変換します。

//this is scala - in the scala lib
object MyPartialFunctions {
  def fromPartialTransformer[I, O](t: PartialTransformer[I, O]) = new PartialFunction[I, O] {
    def isDefinedAt(i: I) = t isDefinedAt i
    def apply(i: I) = {
      val r = t transform i
      if (r eq null) throw new MatchError
      else r
    }
  }
}
.

それからあなたのJavaコードはこれを実行することができます:

//This is Java - in your client code
MyPartialFunctions$.MODULE$.fromPartialTransformer(new PartialTransformer<Integer, String>() {
    @Override public boolean isDefinedAt(Integer i) { /* */ }
    @Override protected String transform0(Integer i) { /* */ }
}
.

MyPartialFunctions$.MODULE$構文が気に入らない場合は、Scala Library 、これを非表示にする Javaクラス

//This is Java - in the scala-lib
public class ScalaUtils {
    public <I, O> scala.PartialFunction<I, O> toPartialFunction(PartialTransformer<I, O> t) {
         MyPartialFunctions$.MODULE$.fromPartialTransformer(t);
    }
}
.

それからあなたの呼び出しサイトは次のようになります:

//This is Java - in your client code
ScalaUtils.toPartialFunction(new PartialTransformer<Integer, String>() {
    @Override public boolean isDefinedAt(Integer i) { /* */ }
    @Override protected String transform0(Integer i) { /* */ }
}
.

これは、AHEM、数レベルの間接的なレベルです!

Chrisの答えを補完するように、Scala 2.10では、これを使用できます。 http://www.scala-lang.org/archives/downloads/distrib/files/ndightly/docs/library/scala/runtime/abstractpartialFunctial.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top