以下代码
fun main(args: Array<String>) {
val a = listOf('A', Pair('X', 'Y'))
println(a[0] == 'B')
}
引发编译错误:
Error:(4, 17) Unresolved reference: ==
Error:(4, 17) No method 'equals(Any?): Boolean' available
为什么会出现这些编译错误?
编辑1 :似乎与when表达式无关。
编辑2 :Code snippet (Press the "run" button on the top right to compile)
我需要手动进行转换以避免编译错误。使用智能投射也无效。 (或者val a: List<Any> = listOf('A', Pair('X', 'Y'))
有用)
答案 0 :(得分:1)
这是一个棘手的情况。
red
和Char
之间的最高公分母恰好是Pair
接口,它没有定义Serializable
方法。 equals()
默认类型定义为其元素的最高公分母。
将数组投射到列表将允许使用在listOf(...)
上实现的equals()
函数,因此使代码起作用:
Any
更优雅的是专门定义fun main(args: Array<String>) {
val a = listOf('A', Pair('X', 'Y')) as List<Any>
println(a[0] == 'B')
println(a[0] == Pair('X', 'Y'))
if (a[0] is Char) {
println(a[0] == 'A')
}
println((a[0] as Char) == 'A')
}
类型:
Any
答案 1 :(得分:0)
免责声明:此答案基于Kotlin 1.2.71。如果您无法重现所描述的行为,请检查您的Kotlin(插件)版本。
正如评论中所指出以及Lior Bar-On的回答所指出的,val a = listOf('A', Pair('X', 'Y'))
的推断类型为List<Serializable>
。
奇怪的是,如果让Kotlin推断类型,则无法编译:
val a = listOf('A', Pair('X', 'Y'))
println(a[0] == 'B')
但是如果您明确指定类型:
val a = listOf<Serializable>('A', Pair('X', 'Y'))
会的。由于以下原因,这在Kotlin游乐场(try.kotlinlang.org)中不起作用:
错误:无法访问“可序列化”:它在“ kotlin.io”内部
,但如果在本地编译。这应该被记录为错误。