如何指定一个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
或其他可Comparable
东西? 这将让你的代码编译。
IntelliJ IDEA在暗示你的答案,尽管在错误的地方:
注意灰色下划线? 这是一个检查,告诉你添加’in’方差修饰符:
将代码更改为interface Property
,编译所有内容。
你可以在这里阅读更多有关方差: http : //kotlinlang.org/docs/reference/generics.html