Вызов аргумента метода дженериков в kotlin - PullRequest
0 голосов
/ 07 сентября 2018
fun <T> doSum(a: T, b: T) : T {
    val result : Number = when {
        a is Int && b is Int -> a + b
        a is Long && b is Long -> a + b
        a is Float && b is Float -> a + b
        a is Double && b is Double -> a + b
        else -> throw IllegalArgumentException() 

    @Suppress("UNCHECKED_CAST")
    return result as T
}

fun <T: Number> doOperation(a: T, b: T, operationToPerform: (T, T) -> T ) {
    println(operationToPerform(a, b))
}

У меня есть метод doOperations, который принимает обобщенную функцию в качестве параметра, который я намерен запустить на двух других переданных параметрах. Тем не менее, вызывая то же самое в основном как:

fun main(args: Array<String>) {
    doOperation (2, 3, doSum)
}

возвращает ошибки типа:

Error:(15, 24) Kotlin: Function invocation 'doSum(...)' expected
Error:(15, 24) Kotlin: No value passed for parameter 'a'
Error:(15, 24) Kotlin: No value passed for parameter 'b'

Есть предложения по вызову doOperation с помощью doSum ()?

(& при изменении doSum на doSum выдает еще одну ошибку: Ошибка: (15, 24) Kotlin: введите параметр связывается с T в fun doSum (a: T, b: T): T не удовлетворено: предполагаемый тип (Int, Int) -> Int не является подтипом числа)

1 Ответ

0 голосов
/ 07 сентября 2018

Для любого, кто придет сюда позже, исправление здесь должно было отправить в doSum(...) метод следующим образом:

doOperation (2, 3, ::doSum)

Добавление :: перед doSum(...) позволяет ссылаться на локальную функцию или функцию-член верхнего уровня.

Подробнее: https://kotlinlang.org/docs/reference/lambdas.html#function-types

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...