Kotlin教程:调用Java代码

2023年 7月 12日 120.5k 0

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) {
    val sum= MyJavaClass.add(5, 10)
    println("printing sum inside Kotlin file: "+sum)
}

Kotlin

代码文件: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);
    }
}

Java

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

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

Shell

从Kotlin文件调用Java int方法

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

代码文件:MyKotlinFile.kt

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

Kotlin

代码文件: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;
    }
}

Java

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

printing area from java insideKotlin file: 12

Shell

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) {
    val area: Int = MyJavaClass.area(3, 6)
    println("printing area from java insideKotlin file: "+area)
}

Kotlin

代码文件: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;
    }
}

Java

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

printing area from java insideKotlin file: 18

Shell

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

Java

文件:MyKotlin.kt -

fun main(args: Array) {
    val myJava = MyJava()

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

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

Kotlin

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

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

Shell

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

Java

文件:MyKotlin.kt -

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

Kotlin

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

数组元素总和:15

Shell

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

Java

文件:MyKotlin.kt -

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

Kotlin

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

0
1
2
3

Shell

让我们来看另一个例子,它在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);
        }
    }
}

Java

文件:MyKotlin.kt -

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

Kotlin

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

string is hello
0
1
2
3

Shell

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 Iterator MutableIterator
Iterable Iterable MutableIterable
Collection Collection MutableCollection
Set MutableSet MutableSet
List MutableList MutableList
ListIterator ListIterator MutableListIterator
Map Map MutableMap
Map.Entry Map.Entry MutableMap.MutableEntry

//原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/kotlin/kotlin-java-interoperability-calling-java-from-kotlin.html#article-start

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论