[最近遇到一个问题,我有一个函数必须以枚举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中,与Java不同,Array<T>
在T
上是不变的,因此,对于作为E
子类型的I
,Array<E>
和Array<I>
不是彼此的子类型。参见:Variance。
鉴于Array<T>
类型也存储项目类型并且不能完全服从unchecked casts,解决此问题的最佳方法是创建一个单独的数组。
fun getMoreInterfaces(): Array<I> {
return E.values().asList().toTypedArray()
}
是Kotlin中的不变泛型类型,因此,如果需要返回(runnable sample)的实例,则即使List<I>
是Difference between List and Array types in Kotlin的子类型,也不能返回Array
。 >
但是如果您只是返回数组中的consumping