Kotlin:UnsupportedOperationException异常与get/set操作符

问题描述:

我试图将我的库中的函数readwrite分别转换为运算符函数getset。我的函数使用了一个泛化的泛型类型,它们也是内联方法。 (你可以看到我的库here。)Kotlin:UnsupportedOperationException异常与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正常工作!这很奇怪,因为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(...)而不是[...]

+0

这是不幸的:-(设置是否有同样的问题? – Jire

+1

啊,lov e那个bug! –