KCallable не работает в Kotlin, когда один из параметров vararg - PullRequest
0 голосов
/ 13 января 2020

У меня проблема с тем, что у меня есть класс, который хранит KCallable<Any> и вызывает его, используя параметры, передаваемые интерпретатором, использующим пользовательский язык сценариев. Это работает для большинства функций, когда я использую KCallable.call(), но, похоже, неправильно обрабатывает функции с параметром vararg, вместо этого предполагая, что параметр является массивом данного типа. Можно ли как-то обойти эту проблему, используя какой-нибудь метод отражения для преобразования входных данных для параметров? Вот мой текущий код:

class KotlinFunction(function: KCallable<Any>) {
    fun call(args: List<Any>) {
        function.call(*args.toTypedArray())
    }
}

с учетом функции в качестве члена класса:

fun concat(vararg xs: String) = xs.reduce{l,r -> l + r}

Используя 3 параметра, я получаю следующую ошибку:

java .lang.IllegalArgumentException: Callable ожидает 1 аргумент, но было предоставлено 3.

1 Ответ

1 голос
/ 13 января 2020

Способ работы аргумента vararg состоит в том, чтобы собрать несколько значений в Array и передать их в функцию. Следовательно, ваша функция concat на самом деле является функцией, которая принимает Array<String> в качестве единственного аргумента, и ссылка на нее имеет тип KFunction1<Array<out String>, String>.

Итак, чтобы вызвать ее с вашей настройкой, то, что вы необходимо передать Array, представляющий vararg аргументы внутри List, что делает этот Array единственным аргументом, входящим в метод KCallable#call после расширения списка:

val kf = KotlinFunction(::concat)
kf.call(listOf(arrayOf("a", "b", "c")))

class KotlinFunction(val function: KCallable<Any>) {
    fun call(args: List<Any>) {
        // Here, `call` will be invoked with one parameter, the Array,
        // as that's the only element in the List
        function.call(*args.toTypedArray())
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...