3

私は次のシグネチャを持つscala関数を持っています:

def getValue: Validation[ Throwable, String ]

resここで、この関数を呼び出した結果(たとえば)をJavaで処理したいと思います。

res.isSuccess()電話をかけることはできますが、根底にあるものや成功res.isFailure()を引き出すにはどうすればよいですか?ThrowableString

キャストしてみましたが、テスト(res instanceof scalaz.Failure)結果はscalaz.Failure cannot be resolved to a type(scalaとscalaz jarが表示されています)

Validation、、、などOptionに対してこれを行う一般的な方法はありEitherますか?

編集私はおそらく使用できることを理解していますfoldが、それはJavaで多くの醜いボイラープレートコードにつながるでしょう(これ以上は必要ありません)。見栄えの良いものはありますか?

4

1 に答える 1

4

SuccessFailureは両方ともケースクラスです:

final case class Success[E, A](a: A) extends Validation[E, A]
final case class Failure[E, A](e: E) extends Validation[E, A]

したがって、たとえば次のように書くことができます。

import scalaz.*;

public class Javaz {
  public static void main(String[] args) {
    Validation<Throwable, String> res = new Success<Throwable, String>("test");

    if (res.isSuccess()) {
      System.out.println(((Success) res).a());
    } else {
      System.out.println(((Failure) res).e());
    }
  }
}

Optionの場合Eitherは、この方法を使用できます(の場合はまたは射影getをとった後)。leftrightEither

可能であればfold、Scala側でこの種のアンラッピングを行う方がおそらくクリーンです。

于 2012-12-08T12:23:16.963 に答える