【问题标题】:Kotlin - Cannot use 'T' as reified type parameter. Use a class insteadKotlin - 不能使用 'T' 作为具体类型参数。改用一个类
【发布时间】:2017-11-20 01:08:00
【问题描述】:

我有一个简单的辅助函数来从 SharedPreferences 中获取价值,如下所示:

operator inline fun <reified T : Any> SharedPreferences.get(key: String, defaultValue: T? = null): T? {
    return when (T::class) {
        String::class -> getString(key, defaultValue as? String) as T?
        Int::class -> getInt(key, defaultValue as? Int ?: -1) as T?
        Boolean::class -> getBoolean(key, defaultValue as? Boolean ?: false) as T?
        Float::class -> getFloat(key, defaultValue as? Float ?: -1f) as T?
        Long::class -> getLong(key, defaultValue as? Long ?: -1) as T?
        else -> throw UnsupportedOperationException("Not yet implemented")
    }
}

我使用了具体类型参数来切换类类型,并且由于它是一个运算符函数,我应该能够使用如下方括号语法调用:

val name: String? = prefs[Constants.PREF_NAME]

但是,每次我调用它时,都会抛出 UnsupportedOperationException 指示函数无法获取类类型。

当我附加调试器并评估 T::class 时,它给了我一个错误 "Cannot use 'T' as reified type parameter. Use a class instead."

我的功能有什么问题?我无法捕捉到错误。谁能帮忙?

编辑:整个班级是herethis is where 我得到了错误。

更新: 似乎是 Kotlin 编译器问题。 追踪https://youtrack.jetbrains.com/issue/KT-17748https://youtrack.jetbrains.com/issue/KT-17748 更新。

【问题讨论】:

标签: java android generics sharedpreferences kotlin


【解决方案1】:

这个问题很好奇,但似乎Int::classInt?::class 不一样(无论如何都是非法表达)。

添加行时:

println(T::class)

get 方法,并调用val age: Int? = prefs["AGE", 23],你会看到它打印出java.lang.Integer

好像Int? 被翻译成了java.lang.Integer

一种可能的(但恕我直言,有点老套)的解决方案是使用对 Java 类的引用作为以下情况:

operator inline fun <reified T : Any> get(key: String, defaultValue: T? = null): T? {
    return when (T::class) {
        String::class -> getString(key, defaultValue as? String) as T?
        java.lang.Integer::class -> getInt(key, defaultValue as? Int ?: -1) as T?
        java.lang.Boolean::class -> getBoolean(key, defaultValue as? Boolean ?: false) as T?
        java.lang.Float::class -> getFloat(key, defaultValue as? Float ?: -1f) as T?
        java.lang.Long::class -> getLong(key, defaultValue as? Long ?: -1) as T?
        else -> throw UnsupportedOperationException("Not yet implemented")
    }
}

【讨论】:

  • 谢谢。你说的对。第一个解决方案现在也可以正常工作。我们是否在 Kotlin 编译器中发现了新错误?
  • @KrupalShah 不是错误,可能是缺点; java.lang.Integer::classInt::class比较时没有特殊处理
  • 嗯..好的。您的第二个解决方案很好,但唯一的问题是即使我想要 String,我也应该能够将 null 作为默认值传递。到时候就不行了。
  • @KrupalShah 哦,是的,我没想到
猜你喜欢
  • 2019-08-23
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多