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)
}