我正在尝试继承枚举的库 API。
abstract class SomeLibraryClass<T> {
abstract fun test(key: String): T
}
class Item<T : Enum<T>> : SomeLibraryClass<T>() {
override fun test(key: String): T {
return enumValueOf(key)
}
}
Run Code Online (Sandbox Code Playgroud)
无法使 T asreified或testas inline。如何继承枚举的库类?
bro*_*oot 12
这不可能。具体化类型必须在编译时已知。这是通过将函数体内联到T已知的调用站点来完成的。
参数化类不知道它的T,因此T不能用作具体化类型。
解决方案是在初始化时捕获Class<T>or的实例并将其保存在属性中:KClass<T>Item
class Item<T : Enum<T>>(
private val enumClass: KClass<T>
) : SomeLibraryClass<T>() {
override fun test(key: String): T {
return java.lang.Enum.valueOf(enumClass.java, key)
}
}
Run Code Online (Sandbox Code Playgroud)
更好的是,如果我们不打算扩展Item,那么我们可以将构造函数设为内部并提供一个捕获KClass/的具体化工厂函数Class:
class Item<T : Enum<T>> @PublishedApi internal constructor(
private val enumClass: KClass<T>
) : SomeLibraryClass<T>() {
companion object {
inline fun <reified T : Enum<T>> create() = Item(T::class)
}
override fun test(key: String): T {
return java.lang.Enum.valueOf(enumClass.java, key)
}
}
Run Code Online (Sandbox Code Playgroud)
我们这样使用它:
val item = Item.create<Color>()
println(item.test("RED"))
Run Code Online (Sandbox Code Playgroud)
java.lang.Enum.valueOf远非理想,但不幸的是 Kotlin 没有提供多平台且平滑的方式来获取枚举值KClass。几年前就请求了此功能: https: //youtrack.jetbrains.com/issue/KT-14743,但仍未实现。
| 归档时间: |
|
| 查看次数: |
3862 次 |
| 最近记录: |