Код Kotlin полностью совместим с кодом Java.
- Вызов кода Java из Kotlin
- Вызов метода Java void из файла Kotlin
- Вызов метода Java int из файла Kotlin
- Код Kotlin, вызывающий класс Java, присутствует внутри пакета
- Код Kotlin, получающий доступ к Java-геттеру и сеттеру
- Код Kotlin обращается к массиву Java
- Доступ к коду Kotlin Java Varargs
- Типы Kotlin и Java Mapped
Вызов кода 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> |
