建议将“等于”更改为“ ==”不能应用于Char和String吗?

Ely*_*lye 3 kotlin

我有如下功能。

    fun process(string: String?): Int {
        if (string != null) {
            return string.filter { it.equals("a") }.length
        }
        return 0
    }
Run Code Online (Sandbox Code Playgroud)

它显示了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
    }
Run Code Online (Sandbox Code Playgroud)

不幸的是现在它错误说明

Operator '==' cannot be applied to Char and String

我认为这是建议的优化中的错误?

Jof*_*rey 5

只是为了确保我们在同一页上,itChar因为filter您使用的方法在字符串上以字符序列的形式进行操作。

您得到的错误是因为==运算符比其方法对应项更具限制性equals(),并且需要类型匹配。由于"a"是字符串,因此无法使用运算符将​​其与字符进行比较it

请注意,即使带有equals()编译的版本也无法正常工作,因为字符串永远不会等于任何字符。这就是Kotlin团队使操作员遇到编译错误的原因:更高的类型安全性。

据我了解,它们遵循Java约定的方法,equals并通过允许Any?作为参数来保留其契约。这可能是由于与Java互操作性的限制。

即使将运算符编译为等效的方法调用,与显式方法调用相比,编译器在运算符形式中还有其他检查。

  • 问题是为什么可以使用`it.equals(“ a”)`而不使用`it ==“ a”`。 (2认同)
  • 简而言之,这种情况下的优化建议是缺陷吗? (2认同)