【问题标题】:Is this really the way to pass void functions to Scala methods from Java?这真的是从 Java 将 void 函数传递给 Scala 方法的方法吗?
【发布时间】:2023-03-19 11:18:02
【问题描述】:

我最近一直在玩 Scala/Java 互操作,特别是从 Java (7) 调用 Scala (2.10.4) 代码。这比我预期的要愉快,但有几件事让我感到困惑。

例如,在scala.runtime 中,我有一个很好的AbstractFunction 抽象类集合。但是对于没有返回值的方法,我看不到任何东西。例如,假设我有以下 Scala 代码:

class MyClass(name: String) {
  def SayWhat(say_fn: String => Unit) = say_fn(name)
}

我的理解是 Java 的 void 或多或少是 Scala 的 Unit,所以我可以使用以下 Java 匿名类传递一些类似于 lambda 的东西:

import scala.Function1;
import scala.runtime.AbstractFunction1;
import scala.runtime.BoxedUnit;

public class MyProgram {
  public static void main(String[] args) {
    MyClass mc = new MyClass("Dan");

    Function1<String, BoxedUnit> f = new AbstractFunction1<String, BoxedUnit>() {
      public BoxedUnit apply(String s) {
        System.out.println("Why, hello there " + s);
          return null;
      }
    };

    mc.SayWhat(f);
  }
}

这显然不是最漂亮的东西,但我很欣赏AbstractFunction 的东西,真的,与我必须做的事情相比!但是真的没有AbstractProcedure 什么的吗?另外,为什么我的“lambda”必须返回BoxedUnit

【问题讨论】:

  • 您可以使用函数def apply[T](f:T=&gt;_):T=&gt;Unit = x =&gt;f(x) 添加一个AbstractProcedure 对象。

标签: java scala lambda scala-java-interop


【解决方案1】:

您的函数实际上必须返回BoxedUnit.UNIT,这是有问题的单位。

UnitAnyVal,而不是 AnyRef,因此它不包含 null。

当函数返回有趣的值时会好很多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    相关资源
    最近更新 更多