枚举接口数组的类型演绎失败。

问题描述 投票:0回答:1

在以下最小的例子中 useFoos(a) 完全可以,但 useFoos(b) 给出 编译错误.

interface FooInterface

fun useFoos(foos: Array<FooInterface>) {}

enum class FooEnum : FooInterface

fun main() {
    val a = FooEnum.values()
    useFoos(a as Array<FooInterface>)
    useFoos(a)

    val b = FooEnum.values()
    useFoos(b) // Error: Type mismatch: inferred type is Array<FooEnum> but Array<FooInterface> was expected
    useFoos(b as Array<FooInterface>)
}

知道为什么会这样吗?如果这不是一个编译器错误,而是预期的行为,谁能告诉我这个行为在哪里有具体解释?

kotlin interface casting type-inference type-deduction
1个回答
2
投票

正如@IR42在 一句话这是因为 智能铸件.

使用 out 关键字 有助于使它在没有铸造的情况下工作。

纠正了代码。

interface FooInterface

fun useFoos(foos: Array<out FooInterface>) {}

enum class FooEnum : FooInterface

fun main() {
    val a = FooEnum.values()
    useFoos(a as Array<FooInterface>)
    useFoos(a)

    val b = FooEnum.values()
    useFoos(b)
    useFoos(b as Array<FooInterface>)
}
© www.soinside.com 2019 - 2024. All rights reserved.