代码之家  ›  专栏  ›  技术社区  ›  Naetmul

等式中奇怪的编译错误:(没有方法'equals(Any?):布尔值(可选)

  •  1
  • Naetmul  · 技术社区  · 8 年前

    下面的代码

    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 回复  |  直到 8 年前
        1
  •  1
  •   Willi Mentzel user670265    8 年前

    这是一个棘手的案件。

    两者之间的最高公分母 Char 和 Pair 碰巧是 Serializable 接口,它不定义 equals() 方法 listOf(...) 默认类型定义为其元素的最高公分母。

    将数组强制转换为列表将允许使用 等于 在上实现的函数 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')
    }
    

    更优雅一点的是定义 任何 具体键入:

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

        2
  •  0
  •   Willi Mentzel user670265    6 年前

    正如在评论和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'))
    

    会的。这在科特林游乐场是行不通的( try.kotlinlang.org )给予:

    错误:无法访问“Serializable”:它在“kotlin”中是内部的。伊奥

    但如果你在本地编译。这应该作为bug归档。