types - 奇怪的平等编译错误 : (No method 'equals(Any?): Boolean' available)

标签 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')) 有效)

最佳答案

这是一个棘手的案例。

Char 之间的最大公分母和 Pair恰好是Serializable接口(interface),它没有定义 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')
}

更优雅一点的是定义 Any具体输入:

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

关于types - 奇怪的平等编译错误 : (No method 'equals(Any?): Boolean' available),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53030524/

相关文章:

C++ 使错误 : object_var has not been declared

kotlin - 任何人都可以激发为什么 Arrow (Kotlin) 选择弃用更高级的类型?

arrays - 将Array <Byte>转换为ByteArray的规范方法是什么

c++ - 努力使 '==' 运算符重载工作 (C++)

嵌套对象的 PHP 对象相等

c# - 如何在 C# 中创建自定义类型的数组?

c++ - 在 C++ 中编译时间类型确定

c++ - opencv Mat数据类型转换和算术

android - 使用 Dispatchers.IO 进行 Kotlin 协程测试

java - 如何在 Java 中比较字符串?