Столкновение с расширением Kotlin

Если у меня есть jar, на пути к классам, где я создал функцию расширения, скажем, класс String для аргумента, и у меня есть еще одна банка с той же функцией расширения на String, как 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 

И если вам нужно использовать другой, вы можете переименовать его с ключевым словом. Это ключевое слово работает для импорта в целом, классов с тем же именем и т. Д.

 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() .

введите описание изображения здесь

Так как функция расширения в 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 }