2017-11-25 82 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

非常感谢。没想到这很简单。 –