我正在构建一个扩展功能KProperty1
。该函数需要接受一个扩展属性 ( R
) 值类型的参数,即使KProperty1
在类型参数中是协变的R
。
下面是一个稍微人为的例子,尽管我的使用更合理。
data class Data(val value: String)
fun <V> KProperty1<*, V>.setMagically(value: V) {
this.javaField?.set(null, value)
}
fun test() {
// I would like this to fail to compile
Data::value.setMagically(190)
}
似乎编译器正在推断 的类型Any
,R
这是完全有效的,因为KProperty1<*, String> : KProperty1<*, Any>
我想说的是,对于我的特殊情况,我实际上想要V
保持不变。我知道您可以使用out
andin
作为方差扩大器,但我无法弄清楚如何指定我想在KProperty1
这种情况下以不变性覆盖协变注释。
值得注意的是,它适用于KMutableProperty1
,因为它在 . 中是不变的R
。但是我的代码也需要使用非可变属性。
对于上下文,我正在构建一些生成数据库查询的东西,这就是为什么我需要将值作为属性类型的子类,即使我实际上并没有写入属性,但是这个问题比我的具体问题更普遍,物业处理案。