Java 调用 Kotlin

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

猜你喜欢

转载自blog.csdn.net/qq_33505109/article/details/81020202