Почему в Котлине это должно быть «есть»?

При попытке преобразовать код из Java в Kotlin для теста Espresso,

Java-код:

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

Код Котлина:

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

'is' на самом деле:

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

Почему синтаксис для него становится 'is' в Котлине?


person lannyf    schedule 03.01.2019    source источник
comment
Потому что is — зарезервированное ключевое слово в Kotlin.   -  person marstran    schedule 03.01.2019
comment
См., например. stackoverflow.com/questions/40025927/, kotlinlang. org/docs/reference/keyword-reference.html   -  person jonrsharpe    schedule 03.01.2019


Ответы (2)


is — это зарезервированное ключевое слово в Kotlin. Для взаимодействия с Java и другими языками программирования, которые могут называть поля или методы, например резервные слова в Kotlin, мы используем обратные кавычки для экранирования имен. Например, в вашем случае метод is из Java экранируется обратными кавычками:

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

Еще один пример экранирования методом when библиотеки Mockito:

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

Документация по Вызов кода Java из Kotlin:

Некоторые ключевые слова Kotlin являются допустимыми идентификаторами в Java: in, object, is и т. д. Если библиотека Java использует ключевое слово Kotlin для метод, вы все равно можете вызвать метод, экранируя его с помощью символа обратной кавычки (`):

foo.`is`(bar)
person Sergey    schedule 03.01.2019

В Kotlin идентификаторы, которые также являются жесткими ключевыми словами (но не мягкие) должны быть отмечены галочкой.

Если вы хотите избежать обратных кавычек, вы можете сделать для этого функцию расширения утилиты с другим именем:

fun <T> Matcher<T>.isA(value: T) = `is`(value)`
person hotkey    schedule 03.01.2019