如何指定一个类型参数我不知道

我已经将我的问题减少到了下面的最小范例:

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

parsePropertyValue的调用不会编译,并显示错误消息“无法推断类型参数T”。 等效的Java代码编译没有问题:

 interface JavaProperty<T extends Comparable<T>> { } class Test { public static void main(String[] args) { JavaProperty<?> property = null; Comparable<?> value = parsePropertyValue(property, "test") } private static <T extends Comparable<T>> T parsePropertyValue(JavaProperty<T> property, String value) { return null; } } 

Kotlin中如何实现类似的功能? 请注意,本例中的Property接口来自外部库,我无法更改它。

根据请求,一个更大的例子:

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

不编译的原因是因为Property必须通过Comparable*不可参数化。

任何机会,你可以改变

val property: Property<*> = TODO()

val property: Property<Int> = TODO()

或其他可Comparable东西? 这将让你的代码编译。

IntelliJ IDEA在暗示你的答案,尽管在错误的地方:

在这里输入图像描述

注意灰色下划线? 这是一个检查,告诉你添加'in'方差修饰符:

在这里输入图像描述

将代码更改为interface Property<in T : Comparable<T>> ,编译完成。

你可以在这里阅读更多有关方差: http : //kotlinlang.org/docs/reference/generics.html