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

我想写一些像

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

以便

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

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

不编译。

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

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

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

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

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

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

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

 class Checker(val property: KProperty1) { 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"))