2017-03-12 147 views
5

如果我有一個jar,在類路徑上,我已經創建了一個擴展函數來說參數的String類,並且我有另一個jar在String上具有相同的擴展函數,Kotlin如何解析二?Kotlin擴展衝突

我認爲如果兩個函數都定義在相同的包中,那麼會有衝突?

但是如果不同的包,我怎麼能區分這兩個擴展?

回答

13

確實,如果它們在同一個包中,它將不會編譯。對於其他情況,假設您有兩個文件具有兩種不同的封裝,包含具有相同簽名的擴展功能:

第一個文件:

package ext1 

fun Int.print() = print(this) 

第二個文件:

package ext2 

fun Int.print() = print(this * 2) 

這你試圖使用它的文件:

package main 

fun main(args: Array<String>) { 
    42.print() 
} 

IntelliJ將實際上給喲ü導入對話框,你可以選擇你要使用哪一個:

enter image description here

您可以導入其中一個是這樣的:

import ext1.print 

如果你需要使用另一個作爲那麼,您可以使用as關鍵字對其進行重命名。此關鍵字適用於一般進口類具有相同的名稱,等

import ext2.print as print2 

所以這個程序編譯並打印4284

package main 

import ext1.print 
import ext2.print as print2 

fun main(args: Array<String>) { 
    42.print() 
    42.print2() 
} 

作爲一個快速的注意,你導入與as的一個關鍵字會稍微難以使用,因爲自動完成似乎無法很好地完成,選擇第二個選項只需完成對42.print()的調用即可。

enter image description here

+0

感謝全面的答案。 –

3

如此以來,在科特林擴展功能僅僅是靜態的功能,其他功能將是進口區分。你

還可以使別名的擴展功能之一更多可讀性:

import by.bkug.extensions.helpers.extension 
import by.bkug.extensions.extension as extension1 

fun test() { 
    myType().extension() // by.bkug.extensions.helpers.extension 
    myType().extention1() // by.bkug.extensions.extension 
} 
+0

感謝您的回答 –