在以下最小的例子中 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>)
}
知道为什么会这样吗?如果这不是一个编译器错误,而是预期的行为,谁能告诉我这个行为在哪里有具体解释?
使用 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>)
}