2012-05-18 10 views
11

相互運用性のために、JavaコードからScala PartialFunctionを渡す必要があります。関数(Function1など)には、匿名型でサブクラス化できるAbstractFunctionがありますが、PartialFunctionで同じことを行う最も簡単な方法は何でしょうか?JavaでScala PartialFunctionを実装する最も簡単な方法は何ですか?

この場合、すべての値に対して定義されているように見えるが、PartialFunctionとして型指定されたJavaの「完全な」関数であることをうれしく思います。

答えて

9

私はここにするだろうが(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のでに依存して(すなわちA ScalaのライブラリをJavaライブラリ以上)、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のライブラリ、あなたからこれを隠し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) { /* */ } 
} 

これには、いくつかの間接的なレベルが含まれます。あなたはTwitterのUtilのライブラリを使用することができる場合、それはこのために特別クラスを持っているhttp://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/runtime/AbstractPartialFunction.html

+0

私はScalaでいくつかのラッパー/ファクトリを作成することを検討しました。しかし、このプロジェクトではScalaで自分でコードを生成することはできません。 – SoftMemes

6

、 。

+0

ありがとうございます。 Scala 2.10用のAkkaがリリースされる予定はありますか? – SoftMemes

+0

Scala 2.10がリリースされたときにしばらくお待ちください。 –

関連する問題