【问题标题】:Use scala.Either from Java从 Java 中使用 scala.Either
【发布时间】:2013-02-19 20:03:22
【问题描述】:

我正在使用来自 java 的 scala 库,特别是返回 Either[A, B] 的函数。在我的java代码中我可以做到:

scalaFunction.callMethod(new Function<Either<A, B>>() {
   public byte[] apply(Either<A, B> result) {
      B right = result.right().???
   }
}

result.right() 返回RightProjection,但我无法在 Java 中导入它(使用 IntelliJ)。 Java 中是否有合适的方法来处理 Either 对象?

【问题讨论】:

    标签: java scala scala-java-interop either


    【解决方案1】:

    我没有对此进行测试,但根据 RightProjection 的 ScalaDoc,您应该可以调用 get()。请注意,如果 result 不是 Right,则会引发异常。

    为了在 IDE 中使用 Scala 类,IDE 需要了解它们。因此,您需要将scala-library.jar 添加到IDE 中指定的构建路径中。对于 IDE(以及 Java 编译器和运行时),Scala 只是一个常规库,它依赖于所有用 Scala 编写的库和程序。

    【讨论】:

    • 问题是我什至无法从 Java 导入 RightProjection。所以执行 result.right().get() 不会编译。我猜 RightProjection 嵌套在源文件中的 Either 伴生对象中,所以从 Java 角度来看它是隐藏的?
    • 你的 IDE 应该能够显示right() 的返回类型,使用它来导入。我猜是scala.util.Either$RightProjectionscala.util.Either$RightProjection$
    • 您是否在 IDE 中包含了 Scala JAR 文件?如果没有,请这样做,那么它应该可以工作。你需要scala-library.jar,它包含相关类的字节码。
    • 是的,看起来好像修复了它。感谢您的帮助!
    【解决方案2】:

    RightProjectionLeftProjection 是在object Either 中定义的嵌套类(不是class Either 的内部类)。您必须跟踪 Scala 对象到 JVM 类的编码。我认为这是对象名称,附加了$ 和其他一些东西......然后JVM级别的RightProjection 类将是一个名称结合了对象的类名和$(我认为是另一个)和RightProjection

    或者类似的东西。我从来不用挖得这么深。

    stockjavap 工具可以帮助您追踪这些信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-09
      • 2012-12-08
      • 2014-12-30
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多