Расширение класса Kotlin - PullRequest
       32

Расширение класса Kotlin

0 голосов
/ 21 февраля 2019

Я только изучаю Kotlin как забавный сайд-проект для Project Euler.Я только начал буквально 5 минут назад, в IntelliJ IDEA.

У меня есть этот код:

fun Number.isMultipleOf(n: Number): Boolean {
    return this % n == 0
}

fun main(args: Array<String>){
    println(10.isMultipleOf(5))
}

Ошибка компиляции такая:

Kotlin: Unresolved reference.  None of the following candidates is applicable because of receiver type mismatch:
@Deprecated @InlineOnly public inline operator fun BigDecimal.mod(other: BigDecimal): BigDecimal defined in kotlin

I'mопыт работы с Java, Python, C ++ и Swift, поэтому я подумал, что Kotlin не должен быть такой большой проблемой.Но WTF - это «тип приемника»?

Как я могу исправить эту ошибку компиляции, одновременно получая желаемую функциональность из расширения класса Number?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Просто пытаюсь объяснить термин тип получателя и упомянутую ошибку.

Ошибка возникает в строке

return this % n == 0

Если вы присмотритесь, this имеет тип переменной номер .поэтому Number - это тип вашего получателя в приведенном выше утверждении (поскольку он получает второй операнд для работы). Number - это абстрактный суперкласс для всех числовых объектов, таких как Int, Float ... в Kotlin, который не имеет встроенной функции для выполнения операции по модулю (%).Следовательно, вы получаете ошибку.Надеюсь, это поможет.

0 голосов
/ 21 февраля 2019

О!

Подумав минуту, isMultipleOf не будет столь эффективен для чисел с плавающей запятой и удваивается из-за проблем точности с плавающей запятой.

Так что это модифицированный код:

fun Int.isMultipleOf(n: Int): Boolean {
    return this % n == 0
}

И это компилируется.

...