gpt4 book ai didi

Kotlin 在类级别具体化类型

转载 作者:行者123 更新时间:2023-12-05 09:28:12 25 4
gpt4 key购买 nike

我正在尝试继承用于枚举的库 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)
}
}

不能将 T 作为 reifiedtest 作为内联。如何继承枚举的库类?

最佳答案

这是不可能的。必须在编译时知 Prop 体化类型。这是通过将函数主体内联到调用站点来实现的,其中 T是已知的。

参数化类不知道它的 T , 所以 T不能用作具体化类型。

解决方案是捕获 Class<T> 的一个实例或 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)
}
}

更好的是,如果我们不打算扩展 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)
}
}

我们这样使用它:

val item = Item.create<Color>()
println(item.test("RED"))

java.lang.Enum.valueOf远非理想,但 AFAIK 不幸的是,Kotlin 没有提供多平台和流畅的方式来从 KClass 获取枚举值。 .多年前请求此功能:https://youtrack.jetbrains.com/issue/KT-14743 , 但仍未实现。

关于Kotlin 在类级别具体化类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71666914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com