建议将"等于"更改为"=="不能应用于字符和字符串?



我有一个如下函数。

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")有效地将CharString进行比较。这永远不会是真的,因为字符串永远不能等于任何字符,即使它只包含一个字符。因此,代码在这两种情况下都不起作用,除非您将字符串"a"更改为字符'a'

即使运算符==编译为等效equals()方法调用,与显式方法调用相比,编译器在运算符形式中具有额外的检查。您得到的错误是因为==运算符需要类型匹配,而不是其方法对应项equals()。(由于"a"是一个字符串,因此不能使用运算符将其与字符it进行比较)。

为什么会有差异?你可能会问。

据我了解,Kotlin 团队遵循了方法equals的 Java 约定,并通过允许Any?作为参数来保持其合约的宽松性。这可能是因为与Java的互操作性的限制。 但是,他们仍然通过操作员的附加类型安全性使我们免于此类错误。

不过,我不得不承认,在要求您替换运算符的方法调用之前,IDE 应该针对不正确的equals调用向您发出警告。

相关内容

  • 没有找到相关文章

最新更新