Совместимость и вызов кода Java из Kotlin

Код Kotlin полностью совместим с кодом Java.

Вызов кода Java из Kotlin

Существующий код Java можно легко вызвать из кода Kotlin, а код Kotlin также вызывается из кода Java обычным способом.

Вызов метода Java void из файла Kotlin

При вызове java-кода из Kotlin, возвращаемые типы которого недействительны, он вернет Unit в файле Kotlin. Если кто-то захочет вернуть это значение, компилятор Kotlin присвоит его файлу Kotlin и вернет Unit.

Пример.

MyKotlinFile.kt

 
fun main(args: Array) { 
val sum= MyJavaClass.add(5, 10) 
println("printing sum inside Kotlin file: "+sum) 
 } 

MyJavaClass.java

 
public class MyJavaClass { 
    public static void main(String[] args){ 
 
    } 
    public static void add(inta,int b){ 
int result = a + b; 
System.out.println("printing inside Java class :"+result); 
    } 
} 

Выход:

printing inside Java class :15 
printing sum inside Kotlin file: kotlin.Unit 

Вызов метода Java int из файла Kotlin

При вызове java-кода типа int или другого(а не void) из файла Kotlin он возвращает результат в тех же типах. Например, вызов метода area() класса Java из файла Kotlin возвращает результат типа int.

MyKotlinFile.kt

 
fun main(args: Array) { 
val area: Int = MyJavaClass.area(3, 4) 
println("printing area from java insideKotlin file: "+area) 
} 

MyJavaClass.java

 
public class MyJavaClass { 
    public static void main(String[] args){ 
 
    } 
    public static int area(int l, int b){ 
int result = l * b; 
        return result; 
    } 
} 

Выход:

printing area from java insideKotlinfile: 12 

Код Kotlin, вызывающий класс Java, присутствует внутри пакета

Если мы хотим вызывать коды Java из файла Kotlin, оба присутствующие в другом пакете, для этого необходимо импортировать имя пакета с классом Java внутри файла Kotlin.

Например, класс Java MyJavaClass.java присутствует внутри пакета myjavapackage, а файл Kotlin MyKotlinFile.kt присутствует внутри пакета mykotlinpackage. В таком случае для вызова кода Java из файла Kotlin необходимо импортировать myjavapackage.MyJavaClass внутри файла Kotlin.

MyKotlinFile.kt

 
package mykotlinpackage 
import myjavapackage.MyJavaClass 
 
fun main(args: Array) { 
val area: Int = MyJavaClass.area(3, 4) 
println("printing area from java inside Kotlin file: "+area) 
} 

MyJavaClass.java

 
package myjavapackage; 
 
public class MyJavaClass { 
    public static void main(String[] args){ 
 
    } 
    public static int area(int l, int b){ 
int result = l * b; 
        return result; 
    } 
} 

Выход:

printing area from java inside Kotlin file: 12 

Код Kotlin, получающий доступ к Java-геттеру и сеттеру

Поскольку Kotlin полностью совместим с Java, мы можем получить доступ к функциям получения и установки класса Java (или класса POJO). Например, создадим метод получения и установки в классе Java MyJava.java со свойствами firstName и lastName. Доступ к этим свойствам осуществляется из файла Kotlin MyKotlin.kt путем создания объекта MyJava.java в файле Kotlin.

MyJava.java

 
public class MyJava{ 
    protected String firstName; 
    protected String lastName; 
 
    public String getfirstName() { 
        return firstName; 
    } 
    public void setfirstName(String firstName) { 
this.firstName = firstName; 
    } 
    public String getlastName() { 
        return lastName; 
    } 
    public void setlastName(String lastName) { 
this.lastName = lastName; 
    } 
} 

MyKotlin.kt

 
fun main(args: Array) { 
val myJava = MyJava() 
 
myJava.lastName = "Kumar" 
myJava.setfirstName("Arjun") 
 
println("accessing value using property: "+myJava.firstName) 
println("accessing value using property: "+myJava.lastName) 
 
println("accessing value using method: "+myJava.getfirstName()) 
println("accessing value using method: "+myJava.getlastName()) 
} 

Выход:

accessing value using property: Arjun 
accessing value using property: Kumar 
accessing value using method: Arjun 
accessing value using method: Kumar 

Код Kotlin обращается к массиву Java

Мы можем просто вызвать метод класса Java, который принимает массив в качестве аргумента из файла Котлин. Например, создайте метод sumValue(), который принимает элемент массива в качестве параметра в классе Java MyJava.java, вычисляя сложение и возвращая результат. Этот метод вызывается из файла Kotlin MyKotlin.kt путем передачи массива в качестве параметра.

MyJava.java

 
public class MyJava { 
 
    public intsumValues(int[] nums) { 
int result = 0; 
        for(int x:nums) { 
            result+=x; 
        } 
        return result; 
    } 
} 

MyKotlin.kt

 
fun main(args: Array){ 
val myJava = MyJava() 
val numArray = intArrayOf(1, 2, 3,4,5) 
val sum = myJava.sumValues(numArray) 
println(sum) 
} 

Выход:

sum of array element is 15 

Доступ к коду Kotlin Java Varargs

В функциональности Java varags мы можем передать любое количество аргументов методу. Параметр Java varargs определяется с помощью многоточия, т.е. трех точек(…) после типа данных.

Следующие пункты должны быть сохранены при использовании параметра varargs:

  • В методе есть только один параметр varargs.
  • Varargsagrument должен быть последним аргументом.

При доступе к varargs Java из Kotlin нам нужно использовать оператор распространения * для передачи массива.

Давайте посмотрим на пример, в котором метод Java использует varargs типа int, который вызывается из файла Kotlin.

MyJava.java

 
public class MyJava { 
    public void display(int... values) { 
        for(int s : values) { 
System.out.println(s); 
        } 
    } 
} 

MyKotlin.kt

 
fun main(args: Array){ 
val myJava = MyJava() 
val array = intArrayOf(0, 1, 2, 3) 
myJava.display(*array) 
} 

Выход:

0 
1 
2 
3 

Давайте посмотрим на другой пример, который принимает два параметра в методе Java, который использует в качестве параметров тип String и переменные типа int, вызываемые из файла Kotlin.

MyJava.java

 
public class MyJava { 
    public void display(String message,int... values) { 
System.out.println("string is " + message); 
        for(int s : values) { 
System.out.println(s); 
        } 
    } 
} 

MyKotlin.kt

 
fun main(args: Array){ 
val myJava = MyJava() 
val array = intArrayOf(0, 1, 2, 3) 
myJava.display("hello",*array) 
} 

Выход:

string is hello 
0 
1 
2 
3 

Типы Kotlin и Java Mapped

Типы Kotlin и Java сопоставляются по-разному, однако они сопоставляются с соответствующими типами. Сопоставление этих типов имеет значение только во время компиляции, а время выполнения остается неизменным.

Примитивные типы Java для соответствующих типов Kotlin

Тип Java Тип Kotlin
byte kotlin.Byte
short kotlin.Short
int kotlin.Int
long kotlin.Long
char kotlin.Char
double kotlin.Double
boolean kotlin.Boolean

Непримитивные типы Java для соответствующих типов Kotlin

Тип Java Тип Kotlin
java.lang.Object kotlin.Any!
java.lang.Cloneable kotlin.Cloneable!
java.lang.Comparable kotlin.Cloneable!
java.lang.Enum kotlin.Enum!
java.lang.Annotation kotlin.Annotation!
java.lang.Deprecated kotlin.Deprecated!
java.lang.CharSequence kotlin.CharSequence!
java.lang.String kotlin.String!
java.lang.Number kotlin.Number!
java.lang.Throwable kotlin.Throwable!

Коробочные примитивные типы Java для соответствующих типов nullableKotlin

Тип Java Тип Kotlin
java.lang.Byte kotlin.Byte?
java.lang.Short kotlin.Short?
java.lang.Integer kotlin.Int?
java.lang.Long kotlin.Long?
java.lang.Character kotlin.Char?
java.lang.Float kotlin.Float?
java.lang.Double kotlin.Double?
java.lang.Boolean kotlin.Boolean?

Типы коллекций Java в соответствующие доступные только для чтения или изменяемые типы Kotlin

Тип Java Kotlin только для чтения Изменяемый тип Kotlin
Iterator<T> Iterator<T> MutableIterator<T>
Iterable<T> Iterable<T> MutableIterable<T>
Collection<T> Collection<T> MutableCollection<T>
Set<T> MutableSet<T> MutableSet<T>
List<T> MutableList<T> MutableList<T>
ListIterator<T> ListIterator<T> MutableListIterator<T>
Map<K, V> Map<K, V> MutableMap<K, V>
Map.Entry<K, V> Map.Entry<K, V> MutableMap.MutableEntry<K, V>

 

Оцените статью