2

我正在构建一个扩展功能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)
}

似乎编译器正在推断 的类型AnyR这是完全有效的,因为KProperty1<*, String> : KProperty1<*, Any>

我想说的是,对于我的特殊情况,我实际上想要V保持不变。我知道您可以使用outandin作为方差扩大器,但我无法弄清楚如何指定我想在KProperty1这种情况下以不变性覆盖协变注释。

值得注意的是,它适用于KMutableProperty1,因为它在 . 中是不变的R。但是我的代码也需要使用非可变属性。

对于上下文,我正在构建一些生成数据库查询的东西,这就是为什么我需要将值作为属性类型的子类,即使我实际上并没有写入属性,但是这个问题比我的具体问题更普遍,物业处理案。

4

1 回答 1

2

这在 Kotlin 中目前是不可能的。事实上,有一个内部注释可以实现这种行为(导致编译器报告错误,如果Any在调用站点没有提到它,但推断它)并且它在 中的多个地方使用kotlin-stdlib,但在标准库之外使用它仍然气馁。

我们计划公开此注释。更多详情,请查看KT-13198

于 2017-11-13T19:05:17.567 回答