2017-07-05 4 views
2

Ich habe eine Funktion in KotlinWie deklariere Parameter als Funktion ohne Rückgabewert?

fun printExecutionTime(block:() -> Any) { 
    run { 
     val currentTimeMillis = System.currentTimeMillis() 
     block() 
     Logr.d("Execution time of " + block.javaClass.name + " -> " + System.currentTimeMillis().minus(currentTimeMillis)) 
    } 
} 

In Java-Code, ich nichtig Referenzfunktion als Parameter übergeben wollen, können aber nicht bcs der Rückgabewert

PerformanceKt.printExecutionTime(this::voidFunc); 

Eine Möglichkeit, mehr verwenden zu Schnittstelle

interface Action { 
    fun call() 
} 

Ist es möglich, es in Kotlin ohne eine zusätzliche Schnittstelle zu deklarieren, so dass der obige Code funktioniert?

Antwort

4

Haben Sie versucht mit ?

fun f(voidFunc:() -> Unit) { 
    // <...> 
} 

upd: Nach einigen googeln ich zugeben muss, dass diese Lösung nicht für Sie arbeiten. Es gibt eine offene issue für die Verwendung von Java Methodenreferenzen mit Kotlin Funktionstypen.

Allerdings gibt es immer noch eine Abhilfe in Java verwenden (sieht hässlich, ja):

public Unit voidFunc() { 
    // <...> 
    return null; 
} 
+0

bist du dir sicher? 'Unit' unterstützt nur den Rückgabetyp der Funktion, unterstützt keine Parameter. Tatsächlich ist es tatsächlich ein generischer Parameter von 'Function0', so dass Sie das Problem des OP nicht lösen können. –

+0

Ja, ich habe schon herausgefunden, was das Problem ist, danke. –

0

Sie java.lang.Runnable zu vermeiden einzuführen zusätzliche Schnittstelle kann zum Beispiel:

fun printExecutionTime(block: Runnable) { 
    run { 
    val currentTimeMillis = System.currentTimeMillis() 
    block.run() 
    //... 
    } 
} 

Dann können Sie den Referenz-Ausdruck der Java-Methode wie folgt verwenden:

PerformanceKt.printExecutionTime(this::voidFunc); 

void voidFunc(){...} 
Verwandte Themen