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

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

1. обзор

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

2. Настройка Kotlin

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

3. Основы

Calling Java from Kotlin is straightforward and smooth since it was built with the idea of interoperability.

Давайте создадим этот класс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")

Стоит отметить, чтоthe new keyword is not required для создания экземпляра объекта.

Язык старается по возможности избегать стандартного кода, поэтому мы не вызываем getters / setters явно - мы можем просто использовать их, используя нотацию полей.

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

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

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

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

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

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

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

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

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

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;
    }
}

If we want to pass an array of primitives to this method, we have to use one of the specialized classes из Котлина:

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

assertEquals(ex.sumValues(numArray), 6)

7. списки параметры

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

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

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

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

В настоящее время нет возможности передатьnull в метод varargs.

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

In Kotlin all exceptions are unchecked, что означает, что компилятор не будет заставлять нас ловить какие-либо исключения:

// 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. отражение

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

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

assertEquals(constructors.size, 1)
assertEquals(constructors[0].name, "com.example.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 Interoperability. Мы рассмотрели несколько простых примеров, чтобы показать, как Kotlin в целом приводит к менее подробному коду.

Как всегда, реализацию всех этих примеров и фрагментов можно найти вover on GitHub. Это проект на основе Maven, поэтому его легко импортировать и запускать.