【发布时间】:2019-08-01 23:27:02
【问题描述】:
考虑以下示例:
import kotlin.reflect.KProperty1
infix fun <T, R> KProperty1<T, R>.test(value: R) = Unit
data class Foo(val bar: Int)
fun main() {
Foo::bar test "Hello"
}
鉴于test 需要R 类型的value,为什么在这种情况下,属性类型为Int,它是否允许我传递String?
【问题讨论】:
-
最有可能推断为
Any。至少可以编译:Foo::bar.test<Foo, Any>("Hello"),它不会使用String或Int而不是Any进行编译。 -
您的问题似乎与
KProperty1上的out R-定义有关...如果不存在,则在传递String时会出现预期的编译时错误。 .. -
我认为stackoverflow.com/a/52720842/4265739 的第一句话回答了你的问题
-
作为一种解决方法(但可能有更好的方法来支持你想要的),你可以将 kproperty 传递给生产者函数,例如:
inline infix fun <T, U, R : U> KProperty1<T, U>.test(block : (KProperty1<T, U>) -> R) = block(this),用法如下:@ 987654337@。这样,如果您返回与R : U不同的任何内容,编译器会警告您...类似的事情也可以通过使用您自己的持有请求类型的中间类型来完成...(例如Foo::bar.toYourIntermediate() test 3)
标签: generics kotlin type-inference typechecking type-parameter