2016-02-08 63 views
4

我想要測試一個Java 8類使用斯卡拉測試rx.Observable。按照斯卡拉2.12.0-M3release notes斯卡拉2.12和Java 8 SAM互操作不編譯

LAMBDA語法SAM類型(實驗)作爲M3的,這個功能 尚未在默認情況下。您可以使用-Xexperimental 編譯器選項啓用它。

當啓用該選項時,類似於Java 8,Scala 2.12允許 通過傳遞 lambda來實例化任何類型的單一抽象方法。

但是,使用搖籃和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,我似乎有時(總是?)需要將lambda明確地提取到相應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() 

這將嘗試通過一個帶有一個參數的「函數」(而不是一個帶有一個參數SAM的接口/特徵的匿名實例)。 _只是表示你不在身體中使用該參數。 Action0call()需要0個參數,因此請使用() => o.foreach { }來代替。