Доступ к расширяющим функциям Kotlin из Java: инструкция

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы вызвать функции-расширение в Kotlin из Java, следует обращение к ним в виде статических методов класса, имя которого соответствует имени файла в Kotlin с добавлением постфикса Kt. Например, если функция-расширение определена в файле StringExtensions.kt:

kotlin
Скопировать код
fun String.greet(): String = "Привет, $this!"

То в Java её можно использовать следующим образом:

Java
Скопировать код
String result = StringExtensionsKt.greet("Мир");
Кинга Идем в IT: пошаговый план для смены профессии

Создание пользовательского именования вызывающего класса для Java

Воспользуйтесь аннотацией @JvmName в Kotlin для того, чтобы определить имя вызывающего класса в Java.

kotlin
Скопировать код
@file:JvmName("DemoUtils") // Задаем имя для Java

fun String.exclaim(): String = "$this!"

При обращении в Java, класс будет называться DemoUtils вместо StringExtensionsKt.

Java
Скопировать код
String excited = DemoUtils.exclaim("Привет, Мир");

Сопоставление концепций между Kotlin и Java

В Java-классе, сгенерированном для функции-расширения Kotlin, тип получателя преобразуется в первый параметр статического метода.

kotlin
Скопировать код
fun String.multiply(times: Int): String = repeat(times)

Чтобы применить данную функцию в Java, передайте объект типа String в качестве первого аргумента:

Java
Скопировать код
String repeated = StringExtensionsKt.multiply("привет", 3);

Использование возможностей Kotlin в Java классах

Для упрощения синтаксиса, импортируйте статические методы в Java классы.

Java
Скопировать код
import static ваш.пакет.StringExtensionsKt.*;

public class JavaUsage {
  public void printGreeting() {
    System.out.println(greet("Пользователь Java"));
  }
}

Визуализация

Функции-расширения Kotlin могут стать доступными для Java, если узнать имя .kt-файла, в котором они находятся, с добавлением Kt.

kotlin
Скопировать код
fun String.hasEmoji(): Boolean { /*...*/ }

В Java:

Java
Скопировать код
boolean hasEmoji = StringKt.hasEmoji("Привет 👋");

Таким образом, возможности Kotlin становятся доступными и для Java.

Поддержка безопасности типа null в Kotlin аннотациями nullability Java

Используйте аннотации @NotNull и @Nullable для корректной интерпретации возможности получения null в Kotlin.

kotlin
Скопировать код
fun String?.orEmpty(): String = this ?: ""

В Java:

Java
Скопировать код
String maybeNull = possiblyNullString.orEmpty();

Использование устоявшихся шаблонов для генерации классов

Kotlin придерживается определенной конвенции при создании классов для взаимодействия с Java. Файл MyExtensions.kt преобразует в:

Java
Скопировать код
import static com.example.MyExtensionsKt.*;

Если вы используете @JvmName, конвенция изменится.

Некоторые фишки Kotlin для Java

Сделайте взаимодействие между Kotlin и Java гибче, используя следующие аннотации:

  • @JvmOverloads для поддержки функций с параметрами по умолчанию.
  • @JvmStatic для вызова методов из Java без создания экземпляра companion объекта.
  • @JvmField для непосредственного доступа к полям с сохранением исходного уровня видимости в Java.

Полезные материалы

  1. Вызов Java из Kotlin | Документация по Kotlin — подробное описание взаимодействия между Kotlin и Java.
  2. Не включать некоторые символы в соответствие регулярных выражений – Stack Overflow — обсуждение использования функций-расширений в Kotlin из Java.
  3. Как использовать расширения Kotlin в Java – Medium — практические советы по использованию расширений Kotlin в Java.
  4. Учебник | DigitalOcean — пособие по функциям-расширениям Kotlin.
  5. YouTube — видеоуроки по использованию функций-расширений Kotlin.