2017-11-25 10 views
0

In Java 8 und 9 ist es möglich, Verfahren Referenzen für den Druck auf die Konsole, wie zB haben:ist es möglich, als Funktion Referenz zu verwenden println in Kotlin

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

In Kotlin fand ich nicht ein Möglichkeit, eine Methodenreferenz zum Drucken auf der Konsole zu verwenden. Ich habe zu übersetzen versucht, diese Funktion Referenz verwenden:

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

zu:

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

Aber ich bin immer diese Fehlermeldung:

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 

Wie kann ich diese Auflösung Mehrdeutigkeit lösen? Kann in diesem Fall eine Funktionsreferenz verwendet werden?

+0

Wenn Kotlin bietet keine Unterstützung für eine Überlastung Angabe Sie eine Wrapper-Funktion erstellen können, die die korrekte Überlastung und Verwendung Anrufe, die stattdessen. –

+1

Docs-Link: https://kotlinlang.org/docs/reference/reflection.html#function-references – chris

Antwort

6

Das Problem ist, dass Sie eine Funktion übergeben, die wiederum die Funktion println zurückgibt, so dass der Compiler nicht herausfinden kann, welche println zurückgeben. Was Sie tun möchten, ist die Verwendung println selbst als Argument, für die Sie () verwenden müssen:

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

vielen dank. Ich konnte mir nicht vorstellen, dass das so einfach war. –

Verwandte Themen