Kotlin: UnsupportedOperationException для усовершенствованного универсального выражения с оператором get/set

Я пытаюсь преобразовать функции read а также write в моей библиотеке операторские функции 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]

1 ответ

Решение

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

В качестве обходного пути используйте .get(...) вместо [...]

Другие вопросы по тегам