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

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

interface Property<T : Comparable> fun <T : Comparable> parsePropertyValue(property: Property, value: String): T = TODO() fun test() { val property: Property = TODO() val value = parsePropertyValue(property, "test") } 

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

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

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

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

 interface Property<T : Comparable> { fun parseValue(value: String): T } interface PropertyStore { fun <T : Comparable> setValue(property: Property, value: T) fun <T : Comparable> getValue(property: Property): T } fun main() { val property: Property = TODO() val unparsedValue: String = TODO() val propertyStore: PropertyStore = TODO() } fun <T : Comparable> parseAndApplyValue(propertyStore: PropertyStore, property: Property, unparsedValue: String) { val parsedValue: T = property.parseValue(unparsedValue) propertyStore.setValue(property, parsedValue) } 

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

任何机会,你可以改变

val property: Property<*> = TODO()

val property: Property = TODO()

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

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

在这里输入图像说明

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

在这里输入图像说明

将代码更改为interface Property> ,编译所有内容。

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