我有一个如下函数。
fun process(string: String?): Int {
if (string != null) {
return string.filter { it.equals("a") }.length
}
return 0
}
它表明it.equals("a")
可以改进,并带有以下消息Call replaceable with binary operator
所以我只是使用Alt-Enter
相应地更改它并获得
fun process(string: String?): Int {
if (string != null) {
return string.filter { it == "a" }.length
}
return 0
}
不幸的是,现在它错误地指出
Operator '==' cannot be applied to Char and String
.
我认为这是建议优化中的一个错误?
为了确保我们在同一页面上,it
是一个Char
,因为您使用的filter
方法作为字符序列对字符串进行操作。 因此,it.equals("a")
有效地将Char
与String
进行比较。这永远不会是真的,因为字符串永远不能等于任何字符,即使它只包含一个字符。因此,代码在这两种情况下都不起作用,除非您将字符串"a"
更改为字符'a'
。
即使运算符==
编译为等效equals()
方法调用,与显式方法调用相比,编译器在运算符形式中具有额外的检查。您得到的错误是因为==
运算符需要类型匹配,而不是其方法对应项equals()
。(由于"a"
是一个字符串,因此不能使用运算符将其与字符it
进行比较)。
为什么会有差异?你可能会问。
据我了解,Kotlin 团队遵循了方法equals
的 Java 约定,并通过允许Any?
作为参数来保持其合约的宽松性。这可能是因为与Java的互操作性的限制。 但是,他们仍然通过操作员的附加类型安全性使我们免于此类错误。
不过,我不得不承认,在要求您替换运算符的方法调用之前,IDE 应该针对不正确的equals
调用向您发出警告。