Kotlin – 不能使用'T'作为实体类型参数。 改用班级
我有一个简单的帮助函数来从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") } }
我已经使用了reified类型参数来切换类类型,因为它是一个运算符函数,我应该可以用下面的方括号语法来调用:
val name: String? = prefs[Constants.PREF_NAME]
但是,每次我调用它,抛出UnsupportedOperationException指示函数都不能获得类的类型。
当我附加调试器并评估T::class
,它给我一个错误"Cannot use 'T' as reified type parameter. Use a class instead."
我的功能有什么问题? 我无法捕捉到这个错误。 谁能帮忙?
编辑:整个班级在这里 , 这是我得到的错误。
更新:似乎是Kotlin编译器问题。 跟踪https://youtrack.jetbrains.com/issue/KT-17748和https://youtrack.jetbrains.com/issue/KT-17748获取更新。
这个问题很好奇,但似乎Int::class
与Int::class
不一样(这是一种非法的表达方式)。
当你添加行时:
println(T::class)
给get
方法,并调用val age: Int? = prefs["AGE", 23]
val age: Int? = prefs["AGE", 23]
,你会看到它打印java.lang.Integer
。
这看起来像Int?
被翻译成java.lang.Integer
。
一个可能的(但是不可靠的)解决方案是使用Java类的引用作为when的情况:
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") } }