likes
comments
collection
share

[Kotlin基础] Java 调用 Kotlin(一)

作者站长头像
站长
· 阅读数 9

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

不一样的protected

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

[基类定义]

[Kotlin基础] Java 调用 Kotlin(一)

[Java 中使用]

[Kotlin基础] Java 调用 Kotlin(一)

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

取代static的Companion

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

[常量定义]

[Kotlin基础] Java 调用 Kotlin(一)

[Kotlin 使用]

[Kotlin基础] Java 调用 Kotlin(一)

[Java 使用]

[Kotlin基础] Java 调用 Kotlin(一)

扩展函数和顶层函数

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

[函数定义]

[Kotlin基础] Java 调用 Kotlin(一)

[Kotlin 使用]

[Kotlin基础] Java 调用 Kotlin(一)

[Java 使用]

[Kotlin基础] Java 调用 Kotlin(一)

还原lambda

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

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

[Kotlin基础] Java 调用 Kotlin(一)

[Kotlin 使用]

[Kotlin基础] Java 调用 Kotlin(一)

[Java 使用]

[Kotlin基础] Java 调用 Kotlin(一)

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

总结

Java 调用 Kotlin 并不是特别常用,毕竟我相信用过 Kotlin 之后,就不会想要使用 Java 了。这次情况特殊,在 Kotlin 的新项目中引入了一些过去的 Java Activity,真是没有对比就没有伤害啊。我再次重申,Kotlin,好用,炫酷,快来用(安利脸)

字数少了点,有机会再补全一下其他的互调的细节,所以加了个(一)。任何问题欢迎留言讨论。RUA。