Доступ к расширяющим функциям Kotlin из Java: инструкция
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы вызвать функции-расширение в Kotlin из Java, следует обращение к ним в виде статических методов класса, имя которого соответствует имени файла в Kotlin с добавлением постфикса Kt
. Например, если функция-расширение определена в файле StringExtensions.kt
:
fun String.greet(): String = "Привет, $this!"
То в Java её можно использовать следующим образом:
String result = StringExtensionsKt.greet("Мир");
Создание пользовательского именования вызывающего класса для Java
Воспользуйтесь аннотацией @JvmName
в Kotlin для того, чтобы определить имя вызывающего класса в Java.
@file:JvmName("DemoUtils") // Задаем имя для Java
fun String.exclaim(): String = "$this!"
При обращении в Java, класс будет называться DemoUtils
вместо StringExtensionsKt
.
String excited = DemoUtils.exclaim("Привет, Мир");
Сопоставление концепций между Kotlin и Java
В Java-классе, сгенерированном для функции-расширения Kotlin, тип получателя преобразуется в первый параметр статического метода.
fun String.multiply(times: Int): String = repeat(times)
Чтобы применить данную функцию в Java, передайте объект типа String
в качестве первого аргумента:
String repeated = StringExtensionsKt.multiply("привет", 3);
Использование возможностей Kotlin в Java классах
Для упрощения синтаксиса, импортируйте статические методы в Java классы.
import static ваш.пакет.StringExtensionsKt.*;
public class JavaUsage {
public void printGreeting() {
System.out.println(greet("Пользователь Java"));
}
}
Визуализация
Функции-расширения Kotlin могут стать доступными для Java, если узнать имя .kt-файла, в котором они находятся, с добавлением Kt
.
fun String.hasEmoji(): Boolean { /*...*/ }
В Java:
boolean hasEmoji = StringKt.hasEmoji("Привет 👋");
Таким образом, возможности Kotlin становятся доступными и для Java.
Поддержка безопасности типа null в Kotlin аннотациями nullability Java
Используйте аннотации @NotNull
и @Nullable
для корректной интерпретации возможности получения null в Kotlin.
fun String?.orEmpty(): String = this ?: ""
В Java:
String maybeNull = possiblyNullString.orEmpty();
Использование устоявшихся шаблонов для генерации классов
Kotlin придерживается определенной конвенции при создании классов для взаимодействия с Java. Файл MyExtensions.kt
преобразует в:
import static com.example.MyExtensionsKt.*;
Если вы используете @JvmName
, конвенция изменится.
Некоторые фишки Kotlin для Java
Сделайте взаимодействие между Kotlin и Java гибче, используя следующие аннотации:
@JvmOverloads
для поддержки функций с параметрами по умолчанию.@JvmStatic
для вызова методов из Java без создания экземпляра companion объекта.@JvmField
для непосредственного доступа к полям с сохранением исходного уровня видимости в Java.
Полезные материалы
- Вызов Java из Kotlin | Документация по Kotlin — подробное описание взаимодействия между Kotlin и Java.
- Не включать некоторые символы в соответствие регулярных выражений – Stack Overflow — обсуждение использования функций-расширений в Kotlin из Java.
- Как использовать расширения Kotlin в Java – Medium — практические советы по использованию расширений Kotlin в Java.
- Учебник | DigitalOcean — пособие по функциям-расширениям Kotlin.
- YouTube — видеоуроки по использованию функций-расширений Kotlin.