从Kotlin调用Java代码

从Kotlin调用Java代码

Kotlin代码与Java代码完全兼容。 Java代码在Kotlin代码中轻松调用,Kotlin代码也可以通过Java代码的正常方式调用。

从Kotlin调用Java代码

从Kotlin文件调用Java void方法

从Kotlin调用返回类型为void的java代码时,它在Kotlin文件中返回Unit。 如果想要返回一个值,它将由Kotlin编译器分配给Kotlin文件并返回Unit。 例如:

代码文件:MyKotlinFile.kt

fun main(args: Array<String>) {
    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(int a,int b){
        int result = a + b;
        System.out.println("printing inside Java class :"+result);
    }
}

运行代码:MyKotlinFile.kt ,得到以下结果 -

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

从Kotlin文件调用Java int方法

在从Kotlin文件调用int类型或其他(而不是void)的java代码时,它返回相同类型的结果。 例如,从Kotlin文件调用Java类的area()方法会返回int类型的结果。

代码文件:MyKotlinFile.kt

fun main(args: Array<String>) {
    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 a, int b){
        int result = a * b;
        return result;
    }
}

运行代码:MyKotlinFile.kt ,得到以下结果 -

printing area from java insideKotlin file: 12

Kotlin调用包内的Java类

如果想要从Kotlin文件调用存在于不同包中的Java代码,则需要在Kotlin文件中使用Java类导入包名。

例如,一个Java类MyJavaClass.java存在于一个包myjavapackage中,一个Kotlin文件MyKotlinFile.kt存在于mykotlinpackage包中。 在这种情况下,从Kotlin文件调用Java代码需要在Kotlin文件中导入myjavapackage.MyJavaClass包。

代码文件:MyKotlinFile.kt

package mykotlinpackage

import myjavapackage.MyJavaClass

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

代码文件:MyJavaClass.java

package myjavapackage;

public class MyJavaClass {
    public static void main(String[] args){

    }
    public static int area(int a, int b){
        int result = a * b;
        return result;
    }
}

运行代码:MyKotlinFile.kt ,得到以下结果 -

printing area from java insideKotlin file: 18

Kotlin代码访问Java getter和setter

由于Kotlin与Java完全互操作,在Kotlin可以访问Java类(或POJO类)的gettersetter方法。例如,在Java类MyJava.java中创建一个gettersetter方法,用于设置和读取firstNamelastName属性。 从Kotlin文件通过使用MyJava.java类来创建对象,在MyKotlin.kt访问这些属性。

文件: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<String>) {
    val myJava = MyJava()

    myJava.lastName = "Max"
    myJava.setfirstName("Su")

    println("使用属性访问值: "+myJava.firstName)
    println("使用属性访问值: "+myJava.lastName)
    println("------------------------------------")
    println("使用方法访问值: "+myJava.getfirstName())
    println("使用方法访问值: "+myJava.getlastName())
}

运行代码:MyKotlin.kt ,得到以下结果 -

使用属性访问值: Su
使用属性访问值: Max
------------------------------------
使用方法访问值: Su
使用方法访问值: Max

Kotlin代码访问Java数组

可以简单地调用Java类方法,该方法将数组作为Kotlin文件中的参数。 例如,创建方法sumValue(),它将数组元素作为Java类MyJava.java中的参数计算加法并返回结果。 通过将数组作为参数传递,从Kotlin文件MyKotlin.kt调用此方法。

文件:MyJava.java -

public class MyJava {

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

文件:MyKotlin.kt -

fun main(args: Array<String>){
    val myJava = MyJava()
    val numArray = intArrayOf(1, 2, 3,4,5)
    val sum = myJava.sumValues(numArray)
    println("数组元素总和:"+sum)
}

运行代码:MyKotlin.kt ,得到以下结果 -

数组元素总和:15

Kotlin代码访问Java可变参数

在Java可变参数函数中,可以将任意数量的参数传递给方法。 Java可变参数使用省略号定义,即数据类型后的三个点(...)。

使用可变参数(varargs)时,应注意以下几点:

  • 方法中只有一个可变参数(varargs)。
  • 可变参数(varargs)必须是最后一个参数。

在从Kotlin访问Java可变参数(varargs)时,需要使用运算符*来传递数组。

下面来看看一个从Kotlin文件调用Java方法使用int类型可变参数(varargs)的示例。

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

文件:MyKotlin.kt -

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

运行代码:MyKotlin.kt ,得到以下结果 -

0
1
2
3

让我们来看另一个例子,它在Java方法中使用两个参数作为String类型的参数,并从Kotlin文件调用的int类型可变参数(varargs)。

文件: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<String>){
    val myJava = MyJava()
    val array = intArrayOf(0, 1, 2, 3)
    myJava.display("hello",*array)
}

运行代码:MyKotlin.kt ,得到以下结果 -

string is hello
0
1
2
3

Kotlin和Java映射类型

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.Comparable!
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盒装原始类型和相应的可空Kotlin类型

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>

目录

数组

字符串

注解

反射