作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我遇到了一个问题,我有一个函数必须返回 I
的数组。 s,以枚举的所有值的形式E
, 与 E
实现接口(interface)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)
}
最佳答案
在 Kotlin 中,与 Java 不同,Array<T>
在 T
上是不变的,所以,对于 E
它是 I
的子类型, Array<E>
和 Array<I>
不是彼此的子类型。见:Variance .
鉴于 Array<T>
types 还存储项目类型,不能完全受制unchecked casts ,解决此问题的最佳方法是创建一个单独的数组。
您可以通过手动创建一个数组并用项目填充它来做到这一点,例如在您的示例中(或使用构造函数 Array(n) { ... }
),或使用 .toTypedArray()
应用于数组的列表表示( .asList()
):
fun getMoreInterfaces(): Array<I> {
return E.values().asList().toTypedArray()
}
List<I>
如果您不在性能关键代码中,这对于 Kotlin 来说比使用数组更惯用,而且也更简单。
关于Kotlin:如果 E 是实现接口(interface) I 的枚举类,则从返回类型为 Array<I> 的函数返回 Array<E>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54200855/
我是一名优秀的程序员,十分优秀!