Добавить в корзинуПозвонить
Найти в Дзене
Уроки по программированию

Совместимость Kotlin и Java

1. Обзор В этом уроке мы собираемся обсудить совместимость Java и Kotlin. Мы рассмотрим некоторые базовые примеры, а также некоторые другие, более сложные сценарии. 2. Настройка Котлина Создать проект Kotlin очень просто, используя IntelliJ, Eclipse и даже командную строку, однако в этом руководстве мы собираемся выполнить шаги установки, поскольку в нем уже есть все, что нам нужно для наших демонстрационных целей. 3. Основы Вызов Java из Kotlin прост и удобен, поскольку он был создан с учетом идеи совместимости. Давайте создадим этот класс Customer , используя ядро ​​Java: public class Customer {
private String firstName;
private String lastName;
private int age;
// standard setters and getters
} 4. Геттеры и сеттеры Давайте теперь поработаем с этим простым Java POJO из Kotlin. Геттеры и сеттеры, соответствующие соглашению Java для этих типов методов, представлены в Kotlin как атрибуты: val customer = Customer()
customer.firstName = "Frodo"
customer.lastName =
Оглавление

1. Обзор

В этом уроке мы собираемся обсудить совместимость Java и Kotlin. Мы рассмотрим некоторые базовые примеры, а также некоторые другие, более сложные сценарии.

2. Настройка Котлина

Создать проект Kotlin очень просто, используя IntelliJ, Eclipse и даже командную строку, однако в этом руководстве мы собираемся выполнить шаги установки, поскольку в нем уже есть все, что нам нужно для наших демонстрационных целей.

3. Основы

Вызов Java из Kotlin прост и удобен, поскольку он был создан с учетом идеи совместимости.

Давайте создадим этот класс Customer , используя ядро ​​Java:

public class Customer {

private String firstName;
private String lastName;
private int age;

// standard setters and getters

}

4. Геттеры и сеттеры

Давайте теперь поработаем с этим простым Java POJO из Kotlin.

Геттеры и сеттеры, соответствующие соглашению Java для этих типов методов, представлены в Kotlin как атрибуты:

val customer = Customer()

customer.firstName = "Frodo"
customer.lastName = "Baggins"

assertEquals(customer.firstName, "Frodo")
assertEquals(customer.lastName, "Baggins")

Стоит отметить, что ключевое слово new не требуется для создания экземпляра объекта.

Язык старается избегать шаблонного кода, насколько это возможно, поэтому мы не вызываем геттеры/сеттеры явно — мы можем просто использовать их, используя обозначение полей.

Нам нужно помнить, что если класс Java имеет только методы установки, свойство не будет доступно, поскольку язык не поддерживает свойства, предназначенные только для установки.

Если метод возвращает void , то при вызове из Kotlin он вернет Unit.

5. Нулевая безопасность

Котлин хорошо известен своей нулевой функцией безопасности, но, как мы знаем, это не относится к Java, что делает его непрактичным для объектов, исходящих из него. Очень простой пример можно увидеть, если у нас есть массив String:

val characterList = ArrayList<String>()
characterList.add("Bilbo")
val character = list[0]

Kotlin не отображает никаких ошибок обнуления во время компиляции, когда метод вызывается для переменной платформенного типа — и этот тип не может быть записан явно на языке. Поэтому, когда присваивается значение, мы можем полагаться на этот вывод или просто выбрать ожидаемый тип:

val a: String? = character
val a: String = character

Они оба разрешены, но в случае ненулевого типа компилятор сразу же подтверждает присвоение, что не позволяет переменной хранить нулевое значение.

В конце концов, компилятор делает все возможное, чтобы избежать нулевых значений, но устранить их все равно невозможно из-за дженериков.

6. Массивы

В Kotlin массивы инвариантны, а это означает, что мы не можем присвоить Array<Int> значению Array<Any> во избежание сбоев во время выполнения.

Итак, у нас есть пример класса:

public class ArrayExample {

public int sumValues(int[] nums) {
int res = 0;

for (int x:nums) {
res += x;
}

return res;
}
}

Если мы хотим передать в этот метод массив примитивов, нам придется использовать один из специализированных классов Kotlin:

val ex = ArrayExample()
val numArray = intArrayOf(1, 2, 3)

assertEquals(ex.sumValues(numArray), 6)

7. Varargs

Java дает нам возможность передавать любое количество аргументов методу:

public int sumArgValues(int... sums) {
// same as above
}

Процесс тот же, с той небольшой разницей, что для передачи массива нам нужно использовать оператор расширения:

assertEquals(ex.sumValues(*numArray), 6)

В настоящее время нет возможности передать значение null методу с переменным числом аргументов.

8. Исключения

В Котлине все исключения не отмечены , а это значит, что компилятор не будет заставлять нас перехватывать какие-либо исключения:

// In our Java code

public void writeList() throws IOException {
File file = new File("E://file.txt");
FileReader fr = new FileReader(file);
fr.close();
}

// In Kotlin

fun makeReadFile() {
val ax = ArrayExample()
ax.writeList()
}

9. Reflection

Проще говоря, отражение работает как с классами Kotlin, так и с Java:

val instance = Customer::class.java
val constructors = instance.constructors

assertEquals(constructors.size, 1)
assertEquals(constructors[0].name, "com.baeldung.java.Customer")

Мы также можем получить методы получения и установки, KProperty для поля Java и KFunction для конструктора.

10. Методы объекта

Когда объекты импортируются в Kotlin, все ссылки типа java.lang.Object заменяются на kotlin.Any:

val instance = Customer::class
val supertypes = instance.supertypes

assertEquals(supertypes[0].toString(), "kotlin.Any")

11. Заключение

Это краткое руководство дает нам более глубокое понимание совместимости Kotlin с Java . Мы рассмотрели несколько простых примеров, чтобы показать, как Kotlin в целом приводит к менее подробному коду.

Оригинал статьи: https://www.baeldung.com/kotlin/java-interoperability