当声明站点协变时,强制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
是不变的。 我知道你可以使用out
和in
作为差异的宽度,但我无法弄清楚如何指定我想重写KProperty1
上的协变注释,这种情况下是不变的。
值得注意的是,它与KMutableProperty1
效果很好,因为它在R
中是不变的。 但是我的代码也需要使用非可变属性。
对于上下文,我建立一些东西,生成数据库查询,这就是为什么我需要的价值是属性types的子类,即使我没有写入属性,但这个问题比我的具体,物业处理案件。
这在Kotlin目前是不可能的。 事实上,有一个内部的注释使得这种行为成为可能(导致编译器报告一个错误,如果Any
被推断,尽管在调用站点没有被提及),它在kotlin-stdlib
多个地方使用,但在外部使用标准图书馆仍然不鼓励。
我们有计划公开这个注释。 欲了解更多详情,请查看KT-13198 。