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(...)
вместо [...]