2016-02-08 4 views
4

Я пытаюсь протестировать класс Java 8, используя rx.Observable от Scala Test. Согласно Scala 2.12.0-M3release notes:Scala 2.12 и Java 8 SAM interop не компилируется

LAMBDA СИНТАКСИС ДЛЯ SAM ВИДОВ (ЭКСПЕРИМЕНТАЛЬНЫЙ) Как М3, эта функция еще не включена по умолчанию. Вы можете включить его с помощью опции компилятора -Xexperimental .

Когда опция включена, то аналогично Java 8, Scala 2.12 допускает создание экземпляра любого типа с помощью одного абстрактного метода путем пропускания лямбда .

Однако, используя 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' 
} 
+0

Я не уверен в 2.12.0-M3, но с 2.11.7 мне кажется, что я иногда (всегда?) Должен явно извлекать лямбды в объявленные значения соответствующего типа SAM. (Которая является головной болью, которую я надеюсь, скоро уйдет.) –

+0

@DavidMoles <2.12.x Поддержка Java 8 - экспериментальная. 2.12 и далее он должен быть официальным. http://scala-lang.org/news/2.12-roadmap/ –

+0

Какая ошибка компилятора? – nafg

ответ

4
scheduler.createWorker().schedule(_ => o.foreach { }) // The argument is an Action0, which has a SAM void call() 

Это попытается пройти «функция» с одним аргументом (скорее анонимный экземпляр интерфейса/признака с 1-аргументным SAM). _ просто указывает, что вы не используете этот аргумент в теле. Action0: call() принимает 0 аргументов, поэтому попробуйте с () => o.foreach { }.