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'))