2016-07-19 81 views
1

我有一個Java的構造,這需要的功能接口作爲參數:通階功能的Java功能接口參數

public ConsumerService(QueueName queue, Consumer<T> function) { 
    super(queue); 
    this.function = function; 
} 

我想使用此構造中階,但編譯器會抱怨,說,它不能解決構造函數。我嘗試了以下幾種方式:

val consumer = new ConsumerService[String](QueueName.CONSUME, this.process _) 
val consumer = new ConsumerService[String](QueueName.PRODUCE, (s: String) => this.process(s)) 

我也嘗試在運行時投下的功能 - 但是,這給我留下了一個ClassCastException:

val consumer = new ConsumerService[String](QueueName.CONSUME, (this.process _).asInstanceOf[Consumer[String]]) 

我如何傳遞一個階功能一個java函數接口參數?

+0

http://stackoverflow.com/questions/29684894/is-there-a-standard-way-to-convert-a-java-util-function-consumert-into-a-java但是那裏沒有真正的答案... – Alec

+0

這是一個不同的事情,因爲沒有Scala參與 – Det

回答

7

你需要創建一個Consumer

val consumer = new ConsumerService[String](QueueName.CONSUME, 
    new Consumer[String]() { override def accept(s: String) = process(s) }) 
0

另一種方法是使用下面的庫:

https://github.com/scala/scala-java8-compat

用在你的項目一旦導入:

import scala.compat.java8.FunctionConverters._

你現在可以這樣寫:

asJavaConsumer[String](s => process(s))

它在你的代碼應該是這樣的:

val consumer = new ConsumerService[String]( QueueName.CONSUME, asJavaConsumer[String](s => process(s)) )