kotlin 在虚函数中具体化泛型
kotlin reified generic in virtual function
在我的具体 class 中,我想要一个具有以下签名的函数。
inline fun <reified T : Comparable<T>> get(key: String): T
但是我想为此 class 提取一个接口,以便我可以交换实现。但是我不确定如何去做,因为我无法将 virtual
函数标记为 inline
。
到目前为止我有这个界面:
interface ModuleSettings {
fun <T : Comparable<T>> get(key: String) : T
}
还有这个具体的class
class DefaultModuleSettings : ModuleSettings {
override inline fun <reified T : Comparable<T>> get(key: String): T {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
但是现在编译器抱怨说我试图用 reified
关键字覆盖泛型类型。有什么办法可以实现这种模式吗?
不能内联接口函数,但可以将class对象作为参数。要仍然获得相同的函数签名,您可以在 DefaultModuleSettings
中创建一个内联具体化重载,委托给接口函数。但是,如果您只有接口类型的引用,则不能调用它。
像这样:
interface ModuleSettings {
fun <T : Comparable<T>> get(key: String, clazz: KClass<T>) : T
}
class DefaultModuleSettings : ModuleSettings {
override fun <T : Comparable<T>> get(key: String, clazz: KClass<T>): T {
TODO("not implemented")
}
inline fun <reified T : Comparable<T>> get(key: String): T = get(key, T::class)
}
编辑:
将内联函数作为扩展函数更好:
inline fun <reified T : Comparable<T>> ModuleSettings.get(key: String): T = get(key, T::class)
我用扩展函数实现了类似的行为:
interface ModuleSettings {
fun <T : Comparable<T>> get(key: String, type: KClass<T>): T
}
inline operator fun <reified T : Comparable<T>> ModuleSettings.get(key: String) = get(key, T::class)
class DefaultModuleSettings : ModuleSettings {
override fun <T : Comparable<T>> get(key: String, type: KClass<T>): T {
TODO("not implemented")
}
}
这不是完全我所期望的,但它在语义上是有效的。但是我仍然认为它是 hack
在我的具体 class 中,我想要一个具有以下签名的函数。
inline fun <reified T : Comparable<T>> get(key: String): T
但是我想为此 class 提取一个接口,以便我可以交换实现。但是我不确定如何去做,因为我无法将 virtual
函数标记为 inline
。
到目前为止我有这个界面:
interface ModuleSettings {
fun <T : Comparable<T>> get(key: String) : T
}
还有这个具体的class
class DefaultModuleSettings : ModuleSettings {
override inline fun <reified T : Comparable<T>> get(key: String): T {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
但是现在编译器抱怨说我试图用 reified
关键字覆盖泛型类型。有什么办法可以实现这种模式吗?
不能内联接口函数,但可以将class对象作为参数。要仍然获得相同的函数签名,您可以在 DefaultModuleSettings
中创建一个内联具体化重载,委托给接口函数。但是,如果您只有接口类型的引用,则不能调用它。
像这样:
interface ModuleSettings {
fun <T : Comparable<T>> get(key: String, clazz: KClass<T>) : T
}
class DefaultModuleSettings : ModuleSettings {
override fun <T : Comparable<T>> get(key: String, clazz: KClass<T>): T {
TODO("not implemented")
}
inline fun <reified T : Comparable<T>> get(key: String): T = get(key, T::class)
}
编辑:
将内联函数作为扩展函数更好:
inline fun <reified T : Comparable<T>> ModuleSettings.get(key: String): T = get(key, T::class)
我用扩展函数实现了类似的行为:
interface ModuleSettings {
fun <T : Comparable<T>> get(key: String, type: KClass<T>): T
}
inline operator fun <reified T : Comparable<T>> ModuleSettings.get(key: String) = get(key, T::class)
class DefaultModuleSettings : ModuleSettings {
override fun <T : Comparable<T>> get(key: String, type: KClass<T>): T {
TODO("not implemented")
}
}
这不是完全我所期望的,但它在语义上是有效的。但是我仍然认为它是 hack