Java 调用 Kotlin

本文探讨了Java调用Kotlin代码时需要注意的几个关键点,包括如何处理受保护的成员、伴生对象中的常量及扩展函数等,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Kotlin 和 Java 的互操作性是 Kotlin 的一大优点,Kotlin 调用 Java 已经基本不需要特别去注意什么了,但是 Java 调用 Kotlin 代码就不那么好看了。项目切换到 Kotlin 的过程中总会有两种语言交错的时候,最近切换 Kotlin 的第一版就要上线了,就先总结一下已经遇到的 Java 调用 Kotlin 的特殊姿势。

不一样的protected

  • Kotlin 继承 Java 时,可以直接拿到 protected 属性
  • Kotlin 继承 Kotlin 时也一样
  • 但是 Java 继承 Kotlin 时,需要用 getter 和 setter 操作 protected 属性
  • 举个例子

[基类定义]

 

 

[Java 中使用]

 

 

  • 如果在 Kotlin 父类中是用 lazy 声明的 protected 属性,在 Java 中获取还要加上getValue()(在 Kotlin 中对应 .value)

ps:使用@JvmField注解可以获得和Kotlin一样的体验

取代static的Companion

  • Kotlin 中没有了 static 关键字,常量可以使用 伴生对象(companion object) 处理
  • 对于绝对的常量,可以使用 const 关键字,此时在 Java 中和在 Kotlin 中的调用方式是一样的。const 只适用于直接初始化为一个 value 的情况。
  • 没有 const 修饰的话,Java 中需要使用 getter 来获取

[常量定义]

 

 

[Kotlin 使用]

 

 

[Java 使用]

 

ps:可以使用@JvmStatic获得一样的体验

扩展函数和顶层函数(Any的扩展函数)

这两个都是 Kotlin 的特性,在 Kotlin 中调用就是如丝般顺滑,但是在 Java 中调用还是普通的静态方法,类名是所在文件名加Kt:

[函数定义]

 

 

[Kotlin 使用]

 

 

[Java 使用]

 

 

还原lambda

Kotlin 支持函数对象,可以将 lambda 作为函数的参数和返回值,这也是 Java 中没有的特性,于是在 Java 中调用这类方法,就会变成匿名内部类(类名就叫 FunctionX, X是数字,表示参数数量):

[定义一个接收 lambda 的函数]

 

 

[Kotlin 使用]

 

[Java 使用]

 

 

invoke 方法就是 lambda 的内容函数了,这也证明了 Kotlin 中 lambda 的实现方式还是定义了一个接口(我记得方法也是一个对象,应该不是一个接口)。使用 lambda 时需要考虑额外的性能开销,尽量使用 inline 优化性能。

ps:我测试了一下,函数的最后一个泛型是返回值的类型

总结

Java 调用 Kotlin 并不是特别常用,毕竟我相信用过 Kotlin 之后,就不会想要使用 Java 了。这次情况特殊,在 Kotlin 的新项目中引入了一些过去的 Java Activity,真是没有对比就没有伤害啊。


原文链接:https://juejin.im/post/5adda4b35188256712782274

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值