Аргумент функции Kotlin без аннотации типа

В Kotlin аргументы функции требуют аннотации типа при определении метода.

В моем случае у меня есть два класса из интерфейса.

interface Base{
    fun method()
}

class DervA():Base{
    fun override method(){
        ...
    }
}

class DervB():Base{
    fun override method(){
        ...
    }
}

И я надеюсь вызвать их методы из другой функции, например

fun test_method(inst){
    inst.method()
}

Но компилятор Kotlin жалуется, что «требуется аннотация типа для параметра значения».

Должен ли я определять "test_method" для каждого из классов?

fun test_method_for_DervA(inst:DervA){
    inst.method()
}

fun test_method_for_DervB(inst:DervB){
    inst.method()
}

Есть ли у вас более умный способ сделать это?


person ric    schedule 06.11.2017    source источник
comment
Вам не хватает ключевого слова fun в переопределениях, и у вас есть лишние скобки в интерфейсе, это опечатки?   -  person jrtapsell    schedule 06.11.2017
comment
@jrtapsell спасибо за ваш комментарий, это были мои ошибки, когда я написал этот вопрос, и я исправил его.   -  person ric    schedule 06.11.2017


Ответы (3)


Вы можете просто сделать

fun testMethod(inst: Base) {
    inst.method()
}

Поскольку и DervA, и DervB являются Base, их также можно передать в testMethod, и будет вызван их замещенный method. Это один из основополагающих принципов ООП.


Обратите внимание, что если method и testMethod имеют один и тот же тип возвращаемого значения, вы можете сократить его до

fun testMethod(inst: Base) = inst.method()
person Ruckus T-Boom    schedule 06.11.2017
comment
Более короткий: val testMethod = Base::method - person chris; 06.11.2017
comment
@chris ну, это не совсем то же самое. fun определяет метод, и в вашем случае testMethod присваивается значение типа KFunction. - person Moira; 06.11.2017
comment
Не полностью эквивалентен, но все же можно использовать с тем же синтаксисом. - person chris; 06.11.2017
comment
Если только взаимодействие с Java не вызывает беспокойства. Я также считаю, что функции обычно легче рассуждать, чем ссылки на функции в свойствах. - person Ruckus T-Boom; 06.11.2017

fun test_method(inst){
    inst.method()
}

Что, по вашему мнению, могло бы помочь компилятору определить тип inst и решить, есть ли у inst даже .method()?

Я полагаю, вам нужно где-то объявить inst: Base, чтобы вывод работал.

person 9000    schedule 06.11.2017

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

fun test_method(inst)

Заявить об этом нужно так:

fun test_method(inst: Base)
person s1m0nw1    schedule 06.11.2017