当声明站点协变时,强制types参数在使用地点不变

我正在KProperty1上构建一个扩展函数。 即使KProperty1在types参数R是协变的,该函数也需要接受扩展属性( R )的值types的参数。

一个稍微人为的例子将是以下,虽然我的使用更合法。

 data class Data(val value: String) fun  KProperty1.setMagically(value: V) { this.javaField?.set(null, value) } fun test() { // I would like this to fail to compile Data::value.setMagically(190) } 

似乎编译器推断出R的typesAny ,这是完全有效的,因为KProperty1 : KProperty1

我想要说的是,对于我的具体情况,我确实希望V是不变的。 我知道你可以使用outin作为差异的宽度,但我无法弄清楚如何指定我想重写KProperty1上的协变注释,这种情况下是不变的。

值得注意的是,它与KMutableProperty1效果很好,因为它在R中是不变的。 但是我的代码也需要使用非可变属性。

对于上下文,我建立一些东西,生成数据库查询,这就是为什么我需要的价值是属性types的子类,即使我没有写入属性,但这个问题比我的具体,物业处理案件。

这在Kotlin目前是不可能的。 事实上,有一个内部的注释使得这种行为成为可能(导致编译器报告一个错误,如果Any被推断,尽管在调用站点没有被提及),它在kotlin-stdlib多个地方使用,但在外部使用标准图书馆仍然不鼓励。

我们有计划公开这个注释。 欲了解更多详情,请查看KT-13198 。