2017-11-25 79 views
0

函數引用在Java 8和9,可以有方法引用打印到控制檯,像如:是有可能使用的println在科特林

List.of(1, 2, 3).forEach(System.out::println); 

在科特林我沒有找到一個使用方法引用打印到控制檯的方法。我試圖把這種使用函數引用:

listOf(1, 2, 3).forEach { println(it) } 

到:

listOf(1, 2, 3).forEach { ::println } 

但我收到此錯誤:

Overload resolution ambiguity. All these functions match. 
@InlineOnly public inline fun println(): Unit defined in kotlin.io 
@InlineOnly public inline fun println(message: Any?): Unit defined in kotlin.io 
@InlineOnly public inline fun println(message: Boolean): Unit defined in kotlin.io 
@InlineOnly public inline fun println(message: Byte): Unit defined in kotlin.io 
@InlineOnly public inline fun println(message: Char): Unit defined in kotlin.io 
@InlineOnly public inline fun println(message: CharArray): Unit defined in kotlin.io 
@InlineOnly public inline fun println(message: Double): Unit defined in kotlin.io 
@InlineOnly public inline fun println(message: Float): Unit defined in kotlin.io 
@InlineOnly public inline fun println(message: Int): Unit defined in kotlin.io 
@InlineOnly public inline fun println(message: Long): Unit defined in kotlin.io 
@InlineOnly public inline fun println(message: Short): Unit defined in kotlin.io 

我怎樣才能解決這個分辨率不確定性?在這種情況下是否可以使用函數引用?

+0

如果科特林不支持指定你可以創建一個調用正確的過載和使用的包裝功能的重載代替。 –

+1

文檔鏈接:https://kotlinlang.org/docs/reference/reflection.html#function-references – chris

回答

6

問題是,你正在傳遞一個函數,該函數又會返回函數println,所以編譯器無法弄清楚哪個函數返回哪個println。你想要做的是使用println本身作爲一個參數,爲此,你需要使用()

listOf(1, 2, 3).forEach(::println) 
+0

非常感謝。沒想到這很簡單。 –