相等时出现奇怪的编译错误:(没有方法“equals(Any?): Boolean”可用)

Nae*_*mul 5 types equality kotlin

下面的代码

fun main(args: Array<String>) {
    val a = listOf('A', Pair('X', 'Y')) 

    println(a[0] == 'B')
}
Run Code Online (Sandbox Code Playgroud)

抛出编译错误:

Error:(4, 17) Unresolved reference: ==
Error:(4, 17) No method 'equals(Any?): Boolean' available
Run Code Online (Sandbox Code Playgroud)

如屏幕截图所示: 截屏

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

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

编辑2代码片段(按右上角的“运行”按钮进行编译)
我需要手动转换以避免编译错误。使用智能转换也不起作用。(或val a: List<Any> = listOf('A', Pair('X', 'Y'))作品)

Lio*_*-On 2

这是一个棘手的案例。

Char和之间的最大共同点Pair恰好是Serializable接口,它不定义equals()方法。listOf(...)默认类型被定义为其元素的最大公分母。

将数组转换为 List 将允许使用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')
}
Run Code Online (Sandbox Code Playgroud)

更优雅的方法是Any专门定义类型:

val a = listOf<Any>('A', Pair('X', 'Y'))