为什么它必须是 Kotlin 中的“is”?

Why does it have to be the`is` in Kotlin?

尝试将代码从 Java 转换为 Kotlin 以进行 Espresso 测试时,

Java代码:

onData(allOf(is(instanceOf(String.class)), is("Americano")))
  .perform(click());

Kotlin 代码:

onData(allOf(`is`(instanceOf(String::class.java)),
    `is`("Americano"))).perform(click())

'is'实际上是:

public static <T> Matcher<T> is(T value) {
    return Is.is(value);
}

为什么它的语法在 Kotlin 中变成 'is'

is 是 Kotlin 中的保留关键字。为了与 Java 和其他可以像 Kotlin 中的保留字一样命名字段或方法的编程语言的互操作性,我们使用 反引号 来转义名称。例如,在您的案例中,来自 Java 的方法 is 使用反引号转义:

onData(allOf(`is`(instanceOf(String::class.java)),
`is`("Americano"))).perform(click())

使用Mockito库的when方法转义的另一个例子:

Mockito.`when`(/*some method is called*/).thenReturn(/*return some result*/)

关于 Calling Java code from Kotlin 的文档:

Some of the Kotlin keywords are valid identifiers in Java: in, object, is, etc. If a Java library uses a Kotlin keyword for a method, you can still call the method escaping it with the backtick (`) character:

foo.`is`(bar)

在 Kotlin 中,标识符也是 hard keywords (but not soft ones) have to be backticked

如果你想避免反引号,你可以使用不同的名称为它创建一个实用程序扩展函数:

fun <T> Matcher<T>.isA(value: T) = `is`(value)`