Kotlin и Java — совместимость на практике
Kotlin и Java — совместимость на практике
Kotlin и Java компилируются в один байт-код JVM. В одном Gradle/Maven-проекте файлы .kt и .java лежат рядом, классы вызывают друг друга напрямую. Сложности появляются на границе API: null, статические методы, коллекции, default-аргументы.
Обзор: экосистема Kotlin. Java-ООП: 18.md. Spring на Kotlin: 232.md.
Словарь терминов
| Термин | Простыми словами |
|---|---|
| JVM | Виртуальная машина; исполняет .class независимо от исходного языка. |
Platform type T! | Тип из Java без null-аннотаций — Kotlin не знает, может ли быть null. |
@Nullable / @NotNull | Подсказки для компилятора Kotlin (JetBrains или javax). |
| SAM | Single Abstract Method — один метод в интерфейсе; Kotlin-лямбда подходит. |
@JvmStatic | Метод object виден в Java как статический. |
@JvmOverloads | Default-аргументы Kotlin → несколько перегрузок в Java. |
Правило большого пальца
| Пишете | Думайте о потребителе |
|---|---|
| Kotlin, вызывают из Java | @JvmStatic, @JvmOverloads, @JvmName при необходимости |
| Java, вызывают из Kotlin | Platform types, явные проверки ?. и !! только где уверены |
| Постепенная миграция | Новые файлы .kt, старые .java в том же пакете |
Вызов Java из Kotlin
Java:
package com.example;
import org.jetbrains.annotations.Nullable;
public class JavaGreeter {
public String greet(@Nullable String name) {
return "Hello, " + (name != null ? name : "World");
}
}
Kotlin:
fun main() {
val g = JavaGreeter()
val s: String? = g.greet(null)
println(s)
}
Разбор:
JavaGreeter()— обычный конструктор Java-класса.@Nullableна параметре → Kotlin видитString?.- Без аннотаций Java
Stringстановится platform typeString!— компилятор разрешит присвоить иString, иString?; ответственность на вас.
Вызов Kotlin из Java
package com.example
object KotlinUtils {
@JvmStatic
fun twice(x: Int) = x * 2
@JvmOverloads
fun join(parts: List<String>, separator: String = ", ") =
parts.joinToString(separator)
}
data class User(val id: Long, val name: String)
Java:
int n = KotlinUtils.twice(21);
String line = KotlinUtils.join(List.of("a", "b"));
User u = new User(1L, "Ann");
long id = u.getId();
String name = u.getName();
| Kotlin | Что видит Java |
|---|---|
object без @JvmStatic | KotlinUtils.INSTANCE.twice() |
@JvmStatic fun twice | KotlinUtils.twice() |
@JvmOverloads + default | Несколько методов join(...) |
data class User | Конструктор, getId(), getName(), copy, equals |
SAM и лямбды
Java:
public interface ClickListener {
void onClick();
}
Kotlin:
val listener = ClickListener { println("click") }
Лямбда Kotlin превращается в реализацию интерфейса с одним методом. Из Java 8+ лямбда передаётся в Kotlin-функцию ( ) -> Unit, если тип функциональный.
Коллекции и мутабельность
Java List из старого API может быть изменяемым ArrayList. Kotlin List — read-only view:
fun process(items: MutableList<String>) {
items.add("tail")
}
На границе указывайте MutableList / java.util.List явно, если код меняет коллекцию.
Постепенная миграция модуля
- Подключить Kotlin в Gradle/Maven (2.md).
- Новые классы —
.ktв том же пакете, что Java. - Заменить POJO на
data class, сервисы — с конструкторной DI. - Удалить
.java, когда тесты зелёные.
Большой модуль одним коммитом без тестов ломает CI — мигрируйте по пакетам или по фичам.
Android — Java SDK + Kotlin UI
Android SDK на Java; UI на Kotlin (229) — обычная схема. Вызовы findViewById из Java Activity и Composable из Kotlin сосуществуют при постепенной миграции.
Частые ошибки
| Симптом | Причина |
|---|---|
| NPE в «безопасном» Kotlin | Java вернул null без @Nullable |
KotlinUtils.INSTANCE.twice | Нет @JvmStatic |
| Дубли методов в Java | Конфликт @JvmOverloads с ручными перегрузками |
UnsupportedOperationException | Изменили read-only Kotlin List, обёрнутый над Java |
Что попробовать
- Extension-функции Kotlin для «обёртки» над Java API.
- Spring Boot на Kotlin в проекте с Java-модулями.
- Один интерфейс на Kotlin, реализация в Java — и наоборот; unit-тест на границе.
Дальше
Spring Boot Kotlin · Room · о разделе
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). История Kotlin - создание языка JetBrains для плавной совместимости с Java и современной разработки. Экосистема Kotlin-приложений - инструменты, фреймворки и мультиплатформенные сценарии разработки. Kotlin — это современный язык программирования общего назначения, который работает на платформе Java Virtual Machine (JVM), а также компилируется в JavaScript или нативный код. Набор советов, правил, принципов и обычаев в разработке на этом языке. Основы Kotlin - архитектура проекта, платформенные модули и базовые принципы разработки на языке. Типизация, набор правил определения типа данных значений языка. Операторы и выражения в Kotlin - логика вычислений, приоритеты операций и идиоматичный стиль записи условий. Циклы и управляющие конструкции в Kotlin - идиоматичные способы итерации, условия и управление выполнением. ООП в Kotlin - классы, модификаторы доступа, наследование и идиоматичное проектирование объектных структур. Кавычки, точки, запятые, скобки и прочие знаки препинания. Kotlin использует набор зарезервированных слов для построения синтаксических конструкций языка. Все ключевые слова разделены на категории по назначению. Набор функций, которые включены в стандартную библиотеку языка.История языка Kotlin
Экосистема Kotlin-приложений
Что требуется знать перед началом изучения языка программирования Kotlin
Рекомендации по разработке на Kotlin
Основы языка Kotlin
Типы данных и объявление переменных
Операторы и выражения в Kotlin
Циклы и управляющие конструкции
Объектно-ориентированное программирование в Kotlin
Синтаксис и пунктуация в Kotlin
Ключевые слова языка Kotlin
Встроенные функции и расширения Kotlin