2017-07-05 67 views
2

我在科特林功能如何將參數聲明爲沒有返回值的函數?

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

在Java代碼中,我想通過無效參考的功能參數,但不能返回值的BCS

PerformanceKt.printExecutionTime(this::voidFunc); 

一種方法使用起來會接口

interface Action { 
    fun call() 
} 

是否有可能在它科特林聲明沒有額外的接口,所以上面的代碼將工作?

回答

4

您是否嘗試過使用Unit

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

UPD:後,一些谷歌上搜索我應該承認,該解決方案將不會爲你工作。有一個開放的issue覆蓋使用Java方法參考Kotlin功能類型。

然而,還是有一種變通方法在的Java使用(長相醜陋,是):

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

你確定你可以嗎? 'Unit'只支持函數返回類型,不支持參數。事實上,它實際上是'Function0'的一個通用參數,所以你不能解決OP的問題。 –

+0

是的,我已經找出問題所在,謝謝。 –

0
您可以使用 java.lang.Runnable避免引入額外的接口,例如

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

那麼你可以使用java方法參考表達式如下:

PerformanceKt.printExecutionTime(this::voidFunc); 

void voidFunc(){...}