0

Я пытаюсь преобразовать функции read и write в свою библиотеку к функциям оператора get и set, соответственно. Мои функции используют тип reified generic, они также встроенные методы. (Вы можете увидеть мою библиотеку here.)Kotlin: UnsupportedOperationException для reified generic с оператором get/set

У компилятора нет вопросов, позволяющих мне проходить, и я не понимаю, почему использование неоператорных функций делает вывод очень хорошим, но использование операторов не выполняется во время выполнения.

Exception in thread "main" java.lang.UnsupportedOperationException: This function has a reified type parameter and thus can only be inlined at compilation time, not called directly. 
    at kotlin.jvm.internal.Intrinsics.throwUndefinedForReified(Intrinsics.java:173) 
    at kotlin.jvm.internal.Intrinsics.throwUndefinedForReified(Intrinsics.java:167) 
    at kotlin.jvm.internal.Intrinsics.reifyJavaClass(Intrinsics.java:201) 

Код выглядит следующим образом:

operator inline fun <reified T> get(address: Long): T { 
    ... 
} 

operator inline fun <reified T> get(address: Int): T = get(address.toLong()) 

operator inline fun <reified T> set(address: Long, data: T) { 
    ... 
} 

operator inline fun <reified T> set(address: Int, data: T): Unit = set(address.toLong(), data) 

Самое интересное в том, что я могу сделать это с помощью инфиксные функций просто отлично, например:

class Example { infix inline fun <reified T> foo(bar: Int) = Any() as T } 

fun main(args: Array<String>) { 
    val example = Example() 
    val foobar: Any = example foo 12345 
} 

Я также могу это сделать с другими операторами, например, обе эти работы:

operator inline fun <reified T> minus(bar: Int) = foo<T>(bar) 

operator inline fun <reified T> plus(bar: Int) = foo<T>(bar) 

Я также заметил, что даже invoke работает правильно! Это странно, так как кажется, что и invoke, и get будут иметь идентичные реализации.

operator inline fun <reified T> invoke(bar: Int) = foo<T>(bar)

Но если добавить следующую функцию, например: operator inline fun <reified T> get(bar: Int) = foo<T>(bar), а затем попробуйте следующий вызов я бегу в ошибку: val get: Any = example[12345]

ответ

4

Это ошибка: https://youtrack.jetbrains.com/issue/KT-9211

В качестве временного решения, используйте .get(...) вместо [...]

+0

Это неудачно :-(У комплекта есть такая же проблема? – Jire

+1

ah, lov e, что ошибка! –