- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试继承用于枚举的库 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 作为 reified
或 test
作为内联。如何继承枚举的库类?
最佳答案
这是不可能的。必须在编译时知 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/
可能很明显,但给出这段代码(来自 http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/reify ): (defn
我有一个空页面,我在其中动态添加元素,我正在尝试使用 Materialize,但我遇到了图形问题... 我已按照“http://materializecss.com/”上的不同教程使用正确的方法添加元
我正在尝试定义关系 callto_status(Goal, Status)总是成功,根据调用Goal的结果统一Status (换句话说,我想实现 call_with_inference_limit/3
我在为我的网站设置包含自动完成 (https://materializecss.com/navbar.html) 的物化搜索栏 (https://materializecss.com/autocomp
我有一个即将到来的逻辑考试,并且一直在学习我类(class)中的一些过去的论文。我遇到了一个关于物化的问题,并将其发布在下面; 用具体化来表示变量 B 的性质 取值为 1 或 8。 在阅读了一些资源并
我有一个 Laravel 项目,其中一个页面有 5 个模态(MaterializeCSS),每个模态都有一个表单。当我提交表单并遇到任何验证错误时,模式必须重新打开。 我可以通过运行以下代码来实现这一
我是一名优秀的程序员,十分优秀!