Kotlin - Java调用Kotlin

Kotlin - Java调用Kotlin 首页 / Kotlin入门教程 / Kotlin - Java调用Kotlin

由于Kotlin与Java语言完全兼容。这意味着可以轻松从Kotlin调用用Java代码编写的应用程序。以类似的方式,还从Java代码中调用了Kotlin代码。

在讨论如何从Java代码调用Kotlin代码之前,让无涯教程看一下Kotlin文件的内部外观。

无涯教程网

让无涯教程在 MyKotlin.kt 文件中创建一个简单的主函数。

fun main(args: Array<String>){
//code
}
fun area(l: Int,b: Int):Int{
    return l*b
}

编译上面的Kotlin文件myKotlin.kt后,内部看起来像:

public class MyKotlinKt{
  public static void main(String[] args){
                     //code
  }
  public static int area(int l, int b){
                     return l*b;
  }
}

Kotlin编译器在内部添加了具有命名约定MyKotlinKt的包装器类。 Kotlin文件MyKotlin.kt被转换为MyKotlinKt,默认情况下它是公共的。高级函数的默认修饰符是public,并且默认情况下该函数转换为static。由于返回类型在MyKotlin.kt中为Unit,因此在MyKotlinKt中将其转换为void。

Java调用Kotlin代码

MyKotlin.kt

fun main(args: Array<String>){
  //code
}
fun area(l: Int,b: Int):Int{
    return l*b
}

MyJava.java

public class MyJava {
    public static void main(String[] args) {
      int area = MyKotlinKt.area(4,5);
      System.out.print("printing area inside Java class returning from Kotlin file: "+area);
    }
}

输出:

printing area inside Java class returning from Kotlin file: 20

Java调用Kotlin文件

如果无涯教程想从都存在于不同包中的Java类中调用Kotlin代码,则需要在Java类中导入带有Kotlin文件名的包名称,并从Java类中调用Kotlin代码。另一种方法是将完整路径指定为packageName.KotlinFileKt.methodName()。

MyKotlin.kt

package mykotlinpackage

fun main(args: Array<String>) {

}
fun area(l: Int,b: Int):Int{
       return l*b
}

MyJava.java

package myjavapackage;
import mykotlinpackage.MyKotlinFileKt;

public class MyJavaClass {
    public static void main(String[] args){
       int area = MyKotlinKt.area(4,5);
       System.out.println("printing area inside Java class returning from Kotlin file: "+area);
    }
}

输出:

printing area inside Java class returning from Kotlin file: 20

注解@JvmName更改Kotlin文件名

可以使用@JvmName批注将Kotlin文件名更改为包装器类名。

链接:https://www.learnfk.comhttps://www.learnfk.com/kotlin/kotlin-java-interoperability-calling-kotlin-from-java.html

来源:LearnFk无涯教程网

MyKotlin.kt

编写Kotlin代码并将注释@file:JvmName(“ MyKotlinFileName”)放在顶部。编译Kotlin代码后,文件名将更改为注释内提供的名称(在无涯教程的情况下为MyKotlinFileName)。在访问MyKotlin.kt的代码时,无涯教程需要使用文件名作为MyKotlinFileName。

@file: JvmName("MyKotlinFileName")
package mykotlinpackage

fun main(args: Array<String>) {

}
fun area(l: Int,b: Int):Int{
       return l*b
}

MyJava.java

package myjavapackage;
import mykotlinpackage.MyKotlinFileName;

public class MyJavaClass {
    public static void main(String[] args){
      int area = MyKotlinFileName.area(4,5);
      System.out.println("printing area inside Java class returning from Kotlin file: "+area);
    }
}

输出:

printing area inside Java class returning from Kotlin file: 20

使用@JvmMultifileClass调用具有相同生成的Java类名称的多个文件的方法

如果Kotlin的多个文件使用@JvmName批注具有相同的生成Java文件名,则通常在从Java文件调用时会出错。但是,Kotlin编译器会生成单个Javafaçade类,其中包含生成的Java文件以及具有相同名称的文件的所有声明。要激活这一代外观,无涯教程在所有文件中使用@JvmMultifileClass批注。

MyKotlin1.kt

@file: JvmName("MyKotlinFileName")
@file:JvmMultifileClass
package mykotlinpackage

fun main(args: Array<String>) {

}
fun area(l: Int,b: Int):Int{
    return l*b
}

MyKotlin2.kt

@file: JvmName("MyKotlinFileName")
@file:JvmMultifileClass
package mykotlinpackage


fun volume(l: Int,b: Int,h: Int):Int{
    return l*b*h
}

MyJava.java

package myjavapackage;
import mykotlinpackage.MyKotlinFileName;

public class MyJavaClass {
    public static void main(String[] args){
      int area = MyKotlinFileName.area(4,5);
      System.out.println("printing area inside Java class returning from Kotlin file: "+area);
      int vol = MyKotlinFileName.volume(4,5,6);
      System.out.println("printing volume inside Java class returning from Kotlin file: "+vol);
    }
}

输出:

printing area inside Java class returning from Kotlin file: 20
printing volume inside Java class returning from Kotlin file: 120

通过const访问Kotlin属性

在顶层和类中用const修饰符注释的Kotlin属性在Java中转换为静态字段。这些属性可以从Java文件访问,称为静态属性。例如:

MyKotlin.kt

constval MAX = 239
object Obj {
  constval CONST = 1
}
class C {
    companion object {
      constval VERSION = 9
    }
}

MyJava.java

public class MyJava {
    public static void main(String[] args) {
      int c = Obj.CONST;
      int m = MyKotlinKt.MAX;
      int v = C.VERSION;
      System.out.println("const "+c+"\nmax "+m+"\nversion "+v);
    }
}

输出:

const 1
max 239
version 9

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

深入拆解Tomcat & Jetty -〔李号双〕

分布式协议与算法实战 -〔韩健〕

深入浅出云计算 -〔何恺铎〕

深度学习推荐系统实战 -〔王喆〕

Go 并发编程实战课 -〔晁岳攀(鸟窝)〕

程序员的测试课 -〔郑晔〕

大数据经典论文解读 -〔徐文浩〕

AI大模型之美 -〔徐文浩〕

手把手带你写一个 MiniTomcat -〔郭屹〕

好记忆不如烂笔头。留下您的足迹吧 :)