Generics 我不知道如何指定类型参数
我已将问题简化为以下最低限度的演示:Generics 我不知道如何指定类型参数,generics,kotlin,Generics,Kotlin,我已将问题简化为以下最低限度的演示: interface Property<T : Comparable<T>> fun <T : Comparable<T>> parsePropertyValue(property: Property<T>, value: String): T = TODO() fun test() { val property: Property<*> = TODO() val va
interface Property<T : Comparable<T>>
fun <T : Comparable<T>> parsePropertyValue(property: Property<T>, value: String): T = TODO()
fun test() {
val property: Property<*> = TODO()
val value = parsePropertyValue(property, "test")
}
如何在Kotlin实现类似的目标?请注意,本例中的属性
接口来自外部库,我无法更改它
根据要求,举一个更大的例子:
interface Property<T : Comparable<T>> {
fun parseValue(value: String): T
}
interface PropertyStore {
fun <T : Comparable<T>> setValue(property: Property<T>, value: T)
fun <T : Comparable<T>> getValue(property: Property<T>): T
}
fun main() {
val property: Property<*> = TODO()
val unparsedValue: String = TODO()
val propertyStore: PropertyStore = TODO()
}
fun <T : Comparable<T>> parseAndApplyValue(propertyStore: PropertyStore, property: Property<T>, unparsedValue: String) {
val parsedValue: T = property.parseValue(unparsedValue)
propertyStore.setValue(property, parsedValue)
}
接口属性{
值(值:字符串):T
}
界面属性存储{
fun setValue(属性:属性,值:T)
fun getValue(属性:属性):T
}
主要内容(){
val属性:属性=TODO()
val unparsedValue:String=TODO()
val propertyStore:propertyStore=TODO()
}
fun parseAndApplyValue(propertyStore:propertyStore,property:property,unparsedValue:String){
val parsedValue:T=property.parseValue(unparsedValue)
setValue(属性,parsedValue)
}
它不编译的原因是属性必须由可比的参数化,而*
不可比
你有机会改变吗
val属性:属性=TODO()
到
val属性:属性=TODO()
还是其他类似的东西?这将使您的代码得以编译。IntelliJ IDEA提示您答案,但在错误的地方:
注意到灰色下划线了吗?这是一个检查,告诉您添加“in”方差修饰符:
将代码更改为接口属性
后,所有内容都将编译
您可以在此处阅读有关差异的更多信息:使用任何类型的。具体如何使用<代码>属性
无效,因为Any
不是Comparable
的子类型,因此不能用于属性
中的T
。请提供一个有意义的示例,说明您试图实现的目标?现在,我觉得Kotlin完全有理由不编译您的程序。我不太确定我的示例中有什么没有意义。我得到了一些属性
,我不知道T是什么。我现在试图通过将属性传递给函数来具体化T
,这样我就可以实际使用该属性了。不过我举了一个更大的例子。这正是我的问题,我不知道是哪种类型。我只知道这是“可比的东西”。我发现最好的表达方式是*
。谢谢你的回答。不幸的是,我无法将添加到
变量中,原因有二:1)属性
不是我代码的一部分,它来自我无法控制的库。2) 即使它是我代码的一部分,Property
中也有返回T
的方法,因此我无法在中生成T
,即使我愿意。@diesieben07是parsePropertyValue
代码的一部分吗?如果是,您可以将其更改为fun parsePropertyValue(property:property,value:String)
?请参阅我文章中的较大示例,以更准确地了解我正在尝试的操作。很遗憾,我需要的是属性
,而不是属性
。我想我明白了。在更大的示例中,您可以将代码提取到一个单独的方法中,并使用T
对该方法进行参数化吗?好的。我怀疑这是一个实际的编译器问题。我已经打开了追踪它的窗口。
interface Property<T : Comparable<T>> {
fun parseValue(value: String): T
}
interface PropertyStore {
fun <T : Comparable<T>> setValue(property: Property<T>, value: T)
fun <T : Comparable<T>> getValue(property: Property<T>): T
}
fun main() {
val property: Property<*> = TODO()
val unparsedValue: String = TODO()
val propertyStore: PropertyStore = TODO()
}
fun <T : Comparable<T>> parseAndApplyValue(propertyStore: PropertyStore, property: Property<T>, unparsedValue: String) {
val parsedValue: T = property.parseValue(unparsedValue)
propertyStore.setValue(property, parsedValue)
}