Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics kotlin在虚函数中具体化了泛型_Generics_Kotlin_Interface_Type Erasure_Kotlin Reified Type Parameters - Fatal编程技术网

Generics kotlin在虚函数中具体化了泛型

Generics kotlin在虚函数中具体化了泛型,generics,kotlin,interface,type-erasure,kotlin-reified-type-parameters,Generics,Kotlin,Interface,Type Erasure,Kotlin Reified Type Parameters,在我的具体类中,我希望有一个具有以下签名的函数 inline fun get(键:String):T 但是,我想为这个类提取一个接口,以便交换实现。但是,我不知道如何进行,因为我无法将虚拟函数标记为内联 到目前为止,我有这个界面: interface ModuleSettings { fun <T : Comparable<T>> get(key: String) : T } 接口模块设置{ 乐趣获取(关键:字符串):T } 还有这个具体的课程 class

在我的具体类中,我希望有一个具有以下签名的函数

inline fun get(键:String):T

但是,我想为这个类提取一个接口,以便交换实现。但是,我不知道如何进行,因为我无法将
虚拟
函数标记为
内联

到目前为止,我有这个界面:

interface ModuleSettings {

    fun <T : Comparable<T>> get(key: String) : T

}
接口模块设置{
乐趣获取(关键:字符串):T
}
还有这个具体的课程

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.
    }
}
类默认模块设置:模块设置{
重写内联乐趣获取(键:字符串):T{
TODO(“未实现”)//要更改已创建函数的主体,请使用文件|设置|文件模板。
}
}

但是现在编译器抱怨说,我试图用
具体化的
关键字覆盖泛型类型。有什么方法可以实现这种模式吗?

您不能内联接口函数,但可以将类对象作为参数。为了仍然获得相同的函数签名,您可以在
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)

}
接口模块设置{
趣味游戏(键:弦,键:KClass):T
}
类DefaultModuleSettings:ModuleSettings{
覆盖乐趣获取(键:String,clazz:KClass):T{
待办事项(“未实施”)
}
内联fun get(key:String):T=get(key,T::class)
}
编辑:

使内联函数成为扩展函数更好:

inline fun <reified T : Comparable<T>> ModuleSettings.get(key: String): T = get(key, T::class)
inline fun 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") 
    }
}
接口模块设置{
乐趣获取(键:字符串,类型:KClass):T
}
内联运算符fun ModuleSettings.get(key:String)=get(key,T::class)
类DefaultModuleSettings:ModuleSettings{
覆盖趣味获取(键:字符串,类型:KClass):T{
待办事项(“未实施”)
}
}

这并不完全是我所期望的,但它在语义上起作用。不过,我仍然认为它是一个黑客“/p>”,我只是想在我的答案发布后马上使用一个扩展函数。这可能是您将获得的最好结果。在具体类中函数重载没有任何用途,因为只有交互组件的接口可见。看我的答案,它非常相似,但使方法实际上从眼睛可见,这是我解释的不好的部分。使用扩展函数更好:)好吧,我想在kotlin中真的没有其他方法可以做到这一点,所以我接受这个答案。该死的