等式中奇怪的编译错误:(无可用的方法“等式(任何?):布尔值”)

时间:2018-10-28 10:32:22

标签: types kotlin equality

以下代码

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

如屏幕截图所示: screenshot

为什么会出现这些编译错误?

编辑1 :似乎与when表达式无关。

编辑2 Code snippet (Press the "run" button on the top right to compile)
我需要手动进行转换以避免编译错误。使用智能投射也无效。 (或者val a: List<Any> = listOf('A', Pair('X', 'Y'))有用)

2 个答案:

答案 0 :(得分:1)

这是一个棘手的情况。

redChar之间的最高公分母恰好是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”内部

,但如果在本地编译。这应该被记录为错误。