2017-09-22 136 views
1

比方說,我想要一個整數,提供square方法。Kotlin的擴展函數如何工作?

科特林

fun Int.square() = this * this 

用法:

println("${20.square()}") 

DOC:

擴展實際上沒有修改他們擴展類。通過定義一個擴展,你不需要在類中插入新的成員,而只需要使用這種類型的變量的點符號來調用新的函數。

我們想強調的是,擴展功能是靜態調度

我預計會一直認爲他們只是在編譯期間將其添加到擴展的類的成員函數,但是這是他們明確拒絕,所以我的下一個想法是,它可能是「有點」像斯卡拉implicits。

的Scala

object IntExtensions{ 
    implicit Class SquareableInt(i:Int){ 
     def square = i*i 
    } 
} 

用法:

import IntExtensions._ 

然後

println(f"${20.square}") 

DOC:

一個隱式類被剝離成類和隱式方法配對,其中implciit方法模仿類的構造函數。

生成的隱式方法將與隱式類具有相同的名稱。

但斯卡拉暗示創建一個新的類,這將禁用this的使用。

那麼... Kotlin如何擴展類? 「打個招呼」並沒有給我太多的提示。

回答

4

在你的情況科特林只是創建簡單的utils的類名稱爲「文件名」千噸和靜態方法「INT方(INT X)」(Java的僞代碼)

從Java它看起來這樣

// filename int-utils.kt 
final class IntUtilsKt { 
    public static int square(int x) { 
     return x * x; 
    } 
} 

並在此之後的所有來電

val result = 20.square()

將TRANSF (在字節碼級上)到

val result = IntUtilsKt.square(20);

P.S. 您可以使用IDEA動作「顯示Kotlin字節碼」自己查看它