我有以下SSCCE:

class Foo(val bars: Map<Int, Bar<*>>) {

    fun <Baz> qux(baz: Baz) {
        val bar2 = bars[2]!!
        bar2.bazes += baz
    }

    interface Bar<Baz> {
        var bazes: MutableList<Baz>
    }
}

这对我来说似乎很好,但是编译器抱怨:
Error:(5, 9) Kotlin: Setter for 'bazes' is removed by type projection

我什至不知道这意味着什么,更不用说如何纠正它了。这是怎么回事,我该如何解决?

最佳答案

有几个小问题。暂时使用bars[2]!! as Bar<Baz>

w: (4, 20): Unchecked cast: Foo.Bar<Any?> to Foo.Bar<Baz>
e: (5, 20): Assignment operators ambiguity:
public operator fun <T> Collection<Baz>.plus(element: Baz): List<Baz> defined in kotlin.collections
@InlineOnly public operator inline fun <T> MutableCollection<in Baz>.plusAssign(element: Baz): Unit defined in kotlin.collections

Kotlin不知道是将其处理为bar2.bazes = bar2.bazes.plus(baz)还是bar2.bazes.plusAssign(baz)。如果将其更改为var2.bazes.add(baz)val bazes,歧义就会消失。

解决该问题并删除不安全的 Actor 表

e: (5, 20): Out-projected type 'MutableList<out Any?>' prohibits the use of 'public abstract fun add(element: E): Boolean defined in kotlin.collections.MutableList'

用类型投影可以安全地做什么的问题。它像out Any?一样被对待,因此您可以从列表中读取,但是可以使用in Nothing,这意味着您无法在列表中添加任何内容。

从此示例尚不清楚为什么要使用*。如果它没有引起任何其他问题,也许您可​​以提出<Baz>参数,例如

class Foo<Baz>(val bars: Map<Int, Bar<Baz>>)

10-08 18:03