如果我有一個jar,在類路徑上,我已經創建了一個擴展函數來說參數的String類,並且我有另一個jar在String上具有相同的擴展函數,Kotlin如何解析二?Kotlin擴展衝突
我認爲如果兩個函數都定義在相同的包中,那麼會有衝突?
但是如果不同的包,我怎麼能區分這兩個擴展?
如果我有一個jar,在類路徑上,我已經創建了一個擴展函數來說參數的String類,並且我有另一個jar在String上具有相同的擴展函數,Kotlin如何解析二?Kotlin擴展衝突
我認爲如果兩個函數都定義在相同的包中,那麼會有衝突?
但是如果不同的包,我怎麼能區分這兩個擴展?
確實,如果它們在同一個包中,它將不會編譯。對於其他情況,假設您有兩個文件具有兩種不同的封裝,包含具有相同簽名的擴展功能:
第一個文件:
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將實際上給喲ü導入對話框,你可以選擇你要使用哪一個:
您可以導入其中一個是這樣的:
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()
的調用即可。
如此以來,在科特林擴展功能僅僅是靜態的功能,其他功能將是進口區分。你
還可以使別名的擴展功能之一更多可讀性:
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
}
感謝您的回答 –
感謝全面的答案。 –