Kotlin и Java полностью интероперабельны, что позволяет:
Java-классы можно использовать в Kotlin напрямую:
// Java класс
public class JavaClass {
public String getMessage() {
return "Hello from Java";
}
}
// Использование в Kotlin
val javaObj = JavaClass()
println(javaObj.message) // Свойство вместо getMessage()
// Kotlin класс
class KtClass(val name: String) {
fun showMessage() = println("Hello, $name")
}
// Использование в Java
KtClass kt = new KtClass("Java");
kt.showMessage();
// Kotlin
val ktList: List<String> = listOf("a", "b")
val javaList: java.util.List<String> = ktList // Автоматическая конвертация
// Kotlin с аннотацией
@JvmField
var nullableField: String? = null
// В Java
String value = ktObject.getNullableField(); // @Nullable
object KtUtils {
@JvmStatic fun utilMethod() { ... }
}
Теперь можно вызвать из Java как статический метод:
KtUtils.utilMethod();
Генерирует перегруженные методы для параметров по умолчанию:
@JvmOverloads
fun greet(name: String, prefix: String = "Mr.") { ... }
// В Java можно вызвать:
greet("John");
greet("John", "Dr.");
Kotlin не требует объявлять checked exceptions:
fun readFile() {
throw IOException() // Без объявления 'throws'
}
В Java придется обрабатывать:
try {
ktObject.readFile();
} catch (IOException e) { ... }
Kotlin использует declaration-site variance:
interface Source<out T> { ... } // Аналог Java <? extends T>
В Java будет выглядеть как:
Source<? extends String> source = ...;
Автоматическое преобразование интерфейсов:
// Java интерфейс
interface OnClickListener {
void onClick();
}
// В Kotlin можно передать лямбду
javaObj.setOnClickListener { println("Clicked") }
Null-safety:
Имена методов:
Свойства:
Kotlin и Java прекрасно взаимодействуют благодаря продуманной системе интероперабельности. Ключевые моменты - автоматические преобразования свойств в методы, аннотации для тонкой настройки поведения, и полная совместимость на уровне JVM байт-кода. Для плавной миграции важно учитывать различия в null-safety и системе типов.