Как перегрузка работает в Kotlin без параметров по умолчанию - PullRequest
0 голосов
/ 28 января 2020

У меня есть функция, которая может принимать один или два параметра. В Java я просто перегрузил бы:

public myMethod( Cat cat, Dog dog){…}

public myMethod( Cat cat){…}

Я понял, что Kotlin имеет параметры по умолчанию, которые делают перегрузку ненужной. Но это объекты, для которых я действительно не знаю, по умолчанию. Так как мне продолжить? И я не хочу утверждать, что он может быть пустым только ради того, чтобы сделать значение по умолчанию нулевым. Какие варианты я не вижу?

в принципе я не хочу этого

fun myMethod(cat:Cat, dog:Dog?=null) //it's never really nullable so don't want to pretend

Ответы [ 4 ]

2 голосов
/ 28 января 2020

Я понял, что Kotlin имеет параметры по умолчанию, которые делают перегрузку ненужной.

Они не имеют; они делают специальное c (и очень распространенное в Java) использование перегрузки ненужным. Если в Java вы напишите

public myMethod(Cat cat){
    myMethod(cat, new Dog(...)) // or myMethod(cat, null)
}

, тогда в Kotlin вы будете использовать аргумент по умолчанию. Если вы этого не сделаете, то вы используете перегруженные методы, как в Java, как показывает ответ mightyWOZ.

1 голос
/ 28 января 2020
Перегрузка

Method (или function) в kotlin работает так же, как и в java. То есть вы можете указать несколько functions с тем же именем, но с другой подписью.

Из Kotlin спецификация языка

Kotlin поддерживает перегрузку функций , , то есть способность нескольких функций с одинаковым именем сосуществовать в одной области действия , при этом компилятор выбирает наиболее подходящую функцию при вызове такой функции.

Так что в вашем случае, если вы не хотите использовать default parameters, , вы можете указать два разных functions с одинаковыми именами, но с разными arguments.

Таким образом, ваш код java может быть преобразован в kotlin как.

fun myMethod(cat: Cat, dog: Dog){…}
fun myMethod(cat: Cat){…}

И вы можете назвать overloaded functions как

var dog = Dog()
var cat = Cat()
myMethod(dog,cat)
myMethod(cat)
0 голосов
/ 28 января 2020

Сначала давайте посмотрим, что говорит языковая документация Kotlin :

Предпочитаю объявлять функции со значениями параметров по умолчанию объявлению перегруженных функций.


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

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

fun myMethod(cat: Cat, dog: Dog = Dog(...)) { 
     // ...
}

Если у вас нет способа инициализации dog при вызове myMethod, это не такая плохая идея ( как вы могли подумать), чтобы сделать параметр обнуляемым. null означает, что значение отсутствует, и это именно тот случай.

fun myMethod(cat: Cat, dog: Dog? = null) {
    // handle nullable dog
}
0 голосов
/ 28 января 2020

Вы можете думать, что Dog обнуляется в вашем Java методе public myMethod( Cat cat){…}. Собаки нет, поэтому ее можно рассматривать как null, поскольку ее не существует. Затем просто проверьте, равно ли оно null в kotlin, и действуйте так, как будто его там никогда не было.

...