Kotlin:从数组中返回Array ,返回类型为Array 如果E是实现接口I的枚举类,则]]

问题描述 投票:2回答:2

[最近遇到一个问题,我有一个函数必须以枚举I的所有值的形式返回E的数组,而E实现接口I,并且每个代码我想到编译器抱怨类型不匹配:

Error:(x, x) Kotlin: Type mismatch: inferred type is Array<E> but Array<I> was expected

一个最小的例子:

    interface I {}
    enum class E: I {
        A, B, C;
    }
    fun getMoreInterfaces(): Array<I> {
        return E.values()
    }

[尝试将E.values()分配给类型Array<I>的变量时会发生这种情况我很肯定这应该可行,因为E实现了I

我在测试时想到的另一件事是,当像这样使用时,它可以正常工作:

    interface I {}
    enum class E: I {
        A, B, C;
    }
    fun getMoreInterfaces(): Array<I> {
        return arrayOf(E.A, E.B, E.C)
    }

我在这个主题上进行了大量搜索,但是没有运气(也许我选择了错误的描述方式?)

最近,我遇到了一个问题,我有一个函数必须以枚举E的所有值的形式返回一个Is数组,并带有E实现接口I,以及我想到的所有代码编译器...] >

kotlin enums type-mismatch generic-variance
2个回答
4
投票

[在Kotlin中,与Java不同,Array<T>T上是不变的,因此,对于作为E子类型的IArray<E>Array<I>不是彼此的子类型。参见:Variance

鉴于Array<T>类型也存储项目类型并且不能完全服从unchecked casts,解决此问题的最佳方法是创建一个单独的数组。


1
投票

fun getMoreInterfaces(): Array<I> { return E.values().asList().toTypedArray() } 是Kotlin中的不变泛型类型,因此,如果需要返回(runnable sample)的实例,则即使List<I>Difference between List and Array types in Kotlin的子类型,也不能返回Array。 >

但是如果您只是返回数组中的consumping

© www.soinside.com 2019 - 2024. All rights reserved.