gpt4 book ai didi

generics - 强制类型参数在声明站点是协变时在使用站点是不变的

转载 作者:行者123 更新时间:2023-12-02 13:39:05 24 4
gpt4 key购买 nike

我正在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是不变的。我知道您可以将 outin用作方差加宽器,但是在这种情况下,我无法弄清楚如何指定要使用不变性覆盖 KProperty1上的协变注释。

值得注意的是,它可以与 KMutableProperty1一起很好地工作,因为 R不变。但是我的代码也需要使用非可变属性。

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

最佳答案

目前在Kotlin中这是不可能的。实际上,有一个内部批注启用了此行为(如果推断Any,尽管未提及调用站点的任何地方,则会导致编译器报告错误),并且已在kotlin-stdlib的多个位置使用了它,但在之外使用了它。仍然不鼓励使用标准库。

我们计划将这个注释公开。有关更多详细信息,请 checkout KT-13198

关于generics - 强制类型参数在声明站点是协变时在使用站点是不变的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47191898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com