Scala 2.12和Java 8的SAM互操作性无法编译

4
我正在尝试使用Scala Test测试一个Java 8类,其中涉及到rx.Observable。根据Scala 2.12.0-M3发布说明

SAM类型的LAMBDA语法(实验性特性):从M3开始,此功能还未默认启用。您可以通过-Xexperimental编译器选项启用它。

启用该选项后,与Java 8类似,Scala 2.12允许通过传递lambda来实例化任何具有单个抽象方法的类型。

然而,使用Gradle和IntelliJ时,我无法使以下代码编译成功:
val o: rx.Observable[util.Map.Entry[String, _ <: util.Collection[String]]] = ???
val scheduler = new TestScheduler()
scheduler.createWorker().schedule(_ => o.foreach { }) // The argument is an Action0, which has a SAM void call()

build.gradle:

apply plugin: 'scala'

group = 'name.abhijitsarkar.scala'
version = '1.0-SNAPSHOT'

tasks.withType(ScalaCompile) {
    scalaCompileOptions.useAnt = false
    scalaCompileOptions.additionalParameters = ["-feature", "-Xexperimental"]
    targetCompatibility = "1.8"
}

dependencies {
    compile 'org.scala-lang:scala-library:2.12.0-M3'
    compile 'com.typesafe.akka:akka-stream-experimental_2.11:2.0.3'
    compile 'io.reactivex:rxjava:1.1.0'
    testCompile 'org.scalatest:scalatest_2.12.0-M3:3.0.0-M12'
}

我不确定2.12.0-M3,但是在2.11.7中似乎有时候(总是?)需要将lambda表达式显式地提取到相应的SAM类型的声明值中。 (这是一个让人头疼的问题,希望很快就能解决。) - David Moles
@DavidMoles < 2.12.x Java 8支持是实验性的。从2.12开始,它应该是官方支持的。 http://scala-lang.org/news/2.12-roadmap/ - Abhijit Sarkar
编译器错误是什么? - nafg
@nafg 我不记得了,已经过去4个月了。 - Abhijit Sarkar
1个回答

4
scheduler.createWorker().schedule(_ => o.foreach { }) // The argument is an Action0, which has a SAM void call()
那会尝试传递一个带有一个参数的“函数”(实际上是一个具有1个参数SAM的匿名接口/特征实例)。_ 只是表示您在主体中不使用该参数。 Action0call() 不需要参数,所以请尝试使用 () => o.foreach { }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接