Kotlin KCallable нелегальная ArgumentException - PullRequest
0 голосов
/ 20 января 2019

У меня есть следующая функция Котлина:

fun invokeSync(typedArguments : List<Any?>): Any?{
    var returnedValue : Any?    
    try {
        returnedValue = callable.call(this, typedArguments);
    } catch (e:Exception) {
        logInvocationError(e, typedArguments);
        throw IllegalArgumentException(e);
    }
}

Неважно, сколько аргументов в этом списке, я всегда получу IllegalArgumentException, говорящее «Callable ожидает 3 аргумента, но 1 был предоставлен».

Функция представляет собой простую функцию isGreater с 2 аргументами типа Int. Я проверил список аргументов и там есть 2 аргумента типа Int.

Здесь функция в контексте:

open class TypedJavaScriptFunction(name: String) : SelfRegisteringJavascriptFunction(MessageFormat.format(JS_NAME_CONVENTION, name)) {

    val callable = getCallable(this::class)

    override fun function(arguments: Array<Any?>): Any? {
        try {
            val typedArguments = getTypedArguments(arguments)
            val annotations = callable.annotations

            for (a in annotations) {
                if (a is BrowserFunction) {
                    if (a.value == Policy.ASYNC) {
                        invokeAsync(typedArguments);
                        return null
                    } else {
                        return invokeSync(typedArguments)
                    }
                }
            }
        } catch (e: IllegalArgumentException) {
            // this Exception is only for signaling the error; it has already
            // been logged before
            JavaScriptAPI.showError(browser, "Internal Error (" + callable.name + ")");
        }
        return null
    }

    fun getTypedArguments(arguments: Array<Any?>): List<Any?> {
        var typedArguments = mutableListOf<Any?>()
        val argTypes = callable.valueParameters
        if (arguments.size != argTypes.size) {
            LOG.error(getName()
                    + ": given arguments don't match signature. Given: "
                    + arguments.size + ", expected: " + argTypes.size);
            throw IllegalArgumentException()
        }

        for (i in 0 until arguments.size) {
            typedArguments.add(TypeRefinery.refine(arguments[i], argTypes[i].type.classifier as KClass<Any>))
        }

        return typedArguments
    }

    // ...

    fun invokeSync(typedArguments: List<Any?>): Any? {
        var returnedValue: Any?
        try {
            returnedValue = callable.call(this, typedArguments);
        } catch (e: Exception) {
            logInvocationError(e, typedArguments);
            throw IllegalArgumentException(e);
        }

        // ...
    }
}

Кто-нибудь может мне помочь и сказать мне, что не так, или может дать мне подсказку?

1 Ответ

0 голосов
/ 20 января 2019

Поскольку call занимает vararg, вам необходимо использовать оператор распространения * и toTypedArray() для передачи List вот так:

returnedValue = callable.call(this, *typedArguments.toTypedArray());

Первый аргумент - это экземпляр, для которого вы вызываете функцию, а два других параметра взяты из расширенного List, при условии, что List содержит ровно два элемента.

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