【问题标题】:Kotlin: UnsupportedOperationException for reified generic with get/set operatorKotlin:带有 get/set 运算符的具体泛型的 UnsupportedOperationException
【发布时间】:2015-12-02 07:22:49
【问题描述】:

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

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

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 &lt;reified T&gt; invoke(bar: Int) = foo&lt;T&gt;(bar)

但如果我将以下函数添加到示例中:operator inline fun &lt;reified T&gt; get(bar: Int) = foo&lt;T&gt;(bar),然后尝试以下调用,我会遇到错误:val get: Any = example[12345]

【问题讨论】:

    标签: function operator-overloading kotlin jvm-languages reification


    【解决方案1】:

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

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

    【讨论】:

    • 这很不幸 :-( set 有同样的问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2014-01-01
    • 2015-12-07
    • 1970-01-01
    • 2010-12-19
    • 2018-02-28
    • 2014-10-07
    相关资源
    最近更新 更多