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