2017-03-12 12 views
5

クラスパス上で、引数のためのStringクラスに拡張関数を作成し、同じ拡張関数を持つ別のjarをStringに作成したjarファイルがある場合、Kotlinはどのように解決しますか二?Kotlin拡張の衝突

私は、両方の機能が同じパッケージに定義されていて、衝突があるとしますか?

しかし、パッケージが異なる場合、どのように2つの拡張子を区別できますか?

答えて

13

実際、同じパッケージに入っているとコンパイルされません。

まずファイル:

package ext1 

fun Int.print() = print(this) 

セカンドファイル:

package ext2 

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

そして、この他のシナリオでは、同じシグネチャを持つ拡張機能を含む、あなたは2種類のパッケージで2つのファイルを持っているとしましょうファイルを使用しようとしている場所:

package main 

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

実際にIntelliJが提供しますあなたが使用したいかを選択することができますuのインポート]ダイアログ:

enter image description here

次のようなそれらの一つインポートすることができます。

import ext1.print 

をそして、あなたはのような他のものを使用する必要がある場合よく、asキーワードで名前を変更できます。このキーワードは

import ext2.print as print2 

など、同じ名前を持つ一般的な、クラスでの輸入のために働くので、このプログラムは4284をコンパイルし、印刷物:

簡単なメモ、あなたが asとインポート一つとして
package main 

import ext1.print 
import ext2.print as print2 

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

オートコンプリートはうまくいきませんので、ここで2番目のオプションを選択すると、42.print()への呼び出しが完了します。

enter image description here

+0

感謝を。 –

3

のでkotlinでの拡張機能は、単なる静的な関数であることから、他の機能は、インポートによって区別されます。

また、あなたは、より読みやすくするための拡張機能の一つのエイリアスを作ることができます:包括的な答えを

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

あなたの答えをありがとう –