Kotlin:UnsupportedOperationException用于get / set操作符

我试图将我的库中readwrite的函数分别转换为运算符函数getset 。 我的函数使用一个泛化的泛型类型,它们也是内联的方法。 (你可以在这里看到我的图书馆。)

编译器没有让我通过的问题,我不明白为什么使用非运算符函数推理工作得很好,但使用运算符在运行时失败。

 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工作正常! 这很奇怪,因为它似乎都invokeget将具有相同的实现。

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]

这是一个错误: https : //youtrack.jetbrains.com/issue/KT-9211

作为解决方法,请使用.get(...)而不是[...]

Interesting Posts