Я пытаюсь преобразовать функции 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]
Это неудачно :-(У комплекта есть такая же проблема? – Jire
ah, lov e, что ошибка! –