Конфликт расширения Kotlin

Если у меня есть банка в пути к классам, где я создал функцию расширения, скажем, для класса String для аргумента, и у меня есть другая банка с той же функцией расширения для String, как Kotlin разрешит их?

Я предполагаю, что если обе функции определены в одних и тех же пакетах, произойдет конфликт?

Но если разные пакеты, как я могу отличить два расширения?


person Big Kahuna    schedule 12.03.2017    source источник


Ответы (2)


Действительно, если они находятся в одном пакете, он не скомпилируется. Для другого сценария предположим, что у вас есть два файла с двумя разными пакетами, содержащими функции расширения с одинаковой сигнатурой:

Первый файл:

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

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

person zsmb13    schedule 12.03.2017
comment
Спасибо за исчерпывающий ответ. - person Big Kahuna; 13.03.2017

Итак, поскольку функция расширения в 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
}
person Ruslan    schedule 12.03.2017
comment
Спасибо за Ваш ответ - person Big Kahuna; 13.03.2017