Types 等式中奇怪的编译错误:(没有方法';equals(任何?):布尔值';可用)

Types 等式中奇怪的编译错误:(没有方法';equals(任何?):布尔值';可用),types,kotlin,equality,Types,Kotlin,Equality,下面的代码 fun main(args: Array<String>) { val a = listOf('A', Pair('X', 'Y')) println(a[0] == 'B') } 如屏幕截图所示: 为什么会发生这些编译错误 编辑1:它似乎与when表达式无关 编辑2: 我需要手动强制转换以避免编译错误。使用智能强制转换也不起作用。(或vala:List=listOf('a',Pair('X','Y'))有效)这是一个棘手的案例 Char和Pair

下面的代码

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

    println(a[0] == 'B')
}
如屏幕截图所示:

为什么会发生这些编译错误

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

编辑2
我需要手动强制转换以避免编译错误。使用智能强制转换也不起作用。(或
vala:List=listOf('a',Pair('X','Y'))
有效)

这是一个棘手的案例

Char
Pair
之间的最大公分母恰好是
Serializable
接口,它没有定义
equals()
方法<代码>列表(…)默认类型定义为其元素的最高公分母

将数组强制转换为列表将允许使用在
Any
上实现的
equals()
函数,因此让代码工作:

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')
}
fun main(args:Array){
val a=列表中的('a',Pair('X','Y')作为列表
println(a[0]=“B”)
println(a[0]==对('X','Y'))
如果(a[0]是字符){
println(a[0]=“a”)
}
println((a[0]作为字符)='a')
}
更优雅的一点是专门定义
Any
类型:


val a=listOf('a',Pair('X','Y'))

正如在评论和Lior Bar On的回答中指出的那样,
val a=listOf('a',Pair('X','Y'))
的推断类型是
List

奇怪的是,如果让Kotlin推断类型,则无法编译:

val a = listOf('A', Pair('X', 'Y')) 
println(a[0] == 'B')
但如果明确指定类型:

val a = listOf<Serializable>('A', Pair('X', 'Y'))
val a=listOf('a',Pair('X','Y'))
会的。这在Kotlin游乐场不起作用()给出:

错误:无法访问“Serializable”:它在“kotlin.io”中是内部的


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

您的项目是如何配置的?Kotlin标准库是否正确连接到它?@yole这是在JVM环境中完成的,Kotlin v.1.2.71Kotlin将您的列表视为
列表
,因为@forpas提到的问题是
可序列化
不包含
等于
运算符。如果您使用
listOf(…)
显式创建列表,或者将您的条件反向
'B'==a[0]
,则问题不会发生。@Pawel不是
可序列化的
任何
的子类型?
实现了
可序列化的
,但
字符
?另外,不是应该使用最高公分母吗?在Char中,它是隐式的,可能是为了跨平台的需要。见:;右-将更正为最高公分母:-)
val a = listOf<Serializable>('A', Pair('X', 'Y'))