Tag: 协方差

当声明站点协变时,强制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的具体问题,但我想更好地理解为什么我会使用声明站点方差(协变和逆变)。 我知道如何使用它们,我只是没有看到太多的好处,或者在哪种情况下,我应该选择一个优先于另一个,为什么我不想一直使用Use-site方差。

在Kotlin中抽象容器工具的generics进/出?

我正在创建一个抽象工具类,在另一组外部类(不受我控制)上运行。 外部类在概念上在界面的某些点上是相似的,但是对于访问它们的类似属性具有不同的语法。 他们也有不同的语法来应用工具的操作结果。 我用@hotkey根据这个答案创建了一个带有内部类的数据类。 这是generics的问题:外部类基本上是元素的容器。 每个类的容器types是不同的。 某些容器具有固定的元素types,而其他容器具有通用元素types。 我很难将这个generics概念in vs, out ,协方差与这个模型的逆变。 下面是一个简单的例子,使用CharSequence和List的切片,就类似于这个generics, // *** DOES NOT COMPILE *** data class Slicer(val obj: C, val beg: Int, val end: Int) { // C is container type; E is element type // but unsure how to apply in/out properly inner abstract class SObj{ abstract val len: Int […]