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::classInt::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") } }