如何向Scala提供Java回调(返回类型为';void')?
我用Scala制作了一个库,它有一个JavaAPI 我想提供这样一个回调(Java): Scala API将其作为类参数或抽象类的方法如何向Scala提供Java回调(返回类型为';void')?,java,scala,language-interoperability,Java,Scala,Language Interoperability,我用Scala制作了一个库,它有一个JavaAPI 我想提供这样一个回调(Java): Scala API将其作为类参数或抽象类的方法 class LoggerJava( onBatch: Stats => Unit, ) 问题是,我不能像上面那样为Scala API提供函数onB。这是必要的: new LoggerJava( (Stats stats) -> { onB(stats); return null; }, ) 这可能是两个不同的问题。我最感兴趣的是听到人们
class LoggerJava(
onBatch: Stats => Unit,
)
问题是,我不能像上面那样为Scala API提供函数onB
。这是必要的:
new LoggerJava(
(Stats stats) -> { onB(stats); return null; },
)
这可能是两个不同的问题。我最感兴趣的是听到人们在这种情况下使用的模式。其目的是,由于实现语言的不同,库的用户不需要采取不同的行动
Scala 2.13
JVM 8+如果您专门为Java提供API,只需使用JDK的Java功能接口即可
import java.util.function.Consumer
class LoggerJava(
onBatch: Consumer[Stats],
)
如果Java API需要与使用Scala函数的代码进行接口,则可以轻松地转换它们
import scala.jdk.FunctionConverters._
private val scalaApi = new LoggerScala(onBatch.asScala)
另一种选择是,Java API的用户必须转换其所有lambda。例如
import scala.jdk.javaapi.FunctionConverters
new LoggerJava(FunctionConverters.asScalaFromConsumer(ClassName::onB))
如果您专门为Java提供API,只需使用JDK的Java功能接口即可
import java.util.function.Consumer
class LoggerJava(
onBatch: Consumer[Stats],
)
如果Java API需要与使用Scala函数的代码进行接口,则可以轻松地转换它们
import scala.jdk.FunctionConverters._
private val scalaApi = new LoggerScala(onBatch.asScala)
另一种选择是,Java API的用户必须转换其所有lambda。例如
import scala.jdk.javaapi.FunctionConverters
new LoggerJava(FunctionConverters.asScalaFromConsumer(ClassName::onB))
解决这个问题,但是他们的用例比我的复杂得多。另外,它们来自于Scala 2.13之前的版本。新LoggerJava(ClassName::onB)的错误是什么?解决这个问题,但是他们的用例比我的复杂得多。另外,它们来自于Scala 2.13之前的版本。新LoggerJava(ClassName::onB)的错误是什么?