如何链接两个Kotlin函数参数的泛型?

我想写一些像

fun <T, R> check(thing: T, property: KProperty1<T, R>, value: R) = property.get(thing) == value 

以便

 assertTrue(check("Hello", String::length, 5)) 

 assertTrue(check("Hello", String::length, "banana")) 

不编译。

这似乎是Kotlin类型推理的一个问题(虽然不管是错误还是设计,我都不知道)。 例如,如果类型是显式的,则不能编译:

 check<String, Int>("Hello", String::length, "banana") 

它可能被设计为像Java的泛型方法类型推理一样工作,这允许这样做,因为编译器推断出这两个参数都是RT的通用超类型。 当我提供不一致的方法参数时,请参阅为什么不输入参数推理失败?

根据上面的帖子,在Java 5,6和7中,你可能会声明它

 fun <T, R, R1: R> check(thing: T, property: KProperty1<T, R>, value: R1) = property.get(thing) == value 

和调用不一致的参数不会编译(我没有尝试过)。 然而,这被认为是一个错误,在Java 8中,调用不一致的参数仍然编译(我试了一下)。

无论如何,你可以把它包装在一个类中,以避免推理,并将类型参数绑定在一起:

 class Checker<T, R>(val property: KProperty1<T, R>) { fun check(thing: T, value: R) = property.get(thing) == value } 
 assertTrue(Checker(String::length).check("Hello", 5)) // does not compile assertTrue(Checker(String::length).check("Hello", "banana"))