[Kotlin基础] Java 调用 Kotlin(一)
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(一)](https://static.blogweb.cn/article/94d13439a36a44429c91e61213edfe16.webp)
[Java 中使用]
![[Kotlin基础] Java 调用 Kotlin(一)](https://static.blogweb.cn/article/8af9c22e4a4145e193b07e4283085a6d.webp)
- 如果在 Kotlin 父类中是用 lazy 声明的 protected 属性,在 Java 中获取还要加上
getValue()
(在 Kotlin 中对应.value
)
取代static的Companion
- Kotlin 中没有了 static 关键字,常量可以使用 伴生对象(companion object) 处理
- 对于绝对的常量,可以使用 const 关键字,此时在 Java 中和在 Kotlin 中的调用方式是一样的。const 只适用于直接初始化为一个 value 的情况。
- 没有 const 修饰的话,Java 中需要使用 getter 来获取
[常量定义]
![[Kotlin基础] Java 调用 Kotlin(一)](https://static.blogweb.cn/article/2d57ab2c7e98426791e7e8f3e60e85bd.webp)
[Kotlin 使用]
![[Kotlin基础] Java 调用 Kotlin(一)](https://static.blogweb.cn/article/3ebe4f8bda0d4d3ea26967e525eefbe4.webp)
[Java 使用]
![[Kotlin基础] Java 调用 Kotlin(一)](https://static.blogweb.cn/article/18dcb6d669ad463eb680bae51b0a2c3e.webp)
扩展函数和顶层函数
这两个都是 Kotlin 的特性,在 Kotlin 中调用就是如丝般顺滑,但是在 Java 中调用还是普通的静态方法,类名是所在文件名加Kt:
[函数定义]
![[Kotlin基础] Java 调用 Kotlin(一)](https://static.blogweb.cn/article/206efa7666584bcaa110f009a5795cdf.webp)
[Kotlin 使用]
![[Kotlin基础] Java 调用 Kotlin(一)](https://static.blogweb.cn/article/df9531a672cc4beba257bc3d870807f1.webp)
[Java 使用]
![[Kotlin基础] Java 调用 Kotlin(一)](https://static.blogweb.cn/article/6f85f0addede4664b20fd4d5845da2eb.webp)
还原lambda
Kotlin 支持函数对象,可以将 lambda 作为函数的参数和返回值,这也是 Java 中没有的特性,于是在 Java 中调用这类方法,就会变成匿名内部类(类名就叫 FunctionX, X是数字,表示参数数量):
[定义一个接收 lambda 的函数]
![[Kotlin基础] Java 调用 Kotlin(一)](https://static.blogweb.cn/article/689ba2c32c42418499bb4d2f082b3248.webp)
[Kotlin 使用]
![[Kotlin基础] Java 调用 Kotlin(一)](https://static.blogweb.cn/article/42f9141782f54782a46306b2b5244ad8.webp)
[Java 使用]
![[Kotlin基础] Java 调用 Kotlin(一)](https://static.blogweb.cn/article/65e4bcfbd39b42c6b9e474c9ef5361d6.webp)
invoke 方法就是 lambda 的内容函数了,这也证明了 Kotlin 中 lambda 的实现方式还是定义了一个接口。使用 lambda 时需要考虑额外的性能开销,尽量使用 inline 优化性能。
总结
Java 调用 Kotlin 并不是特别常用,毕竟我相信用过 Kotlin 之后,就不会想要使用 Java 了。这次情况特殊,在 Kotlin 的新项目中引入了一些过去的 Java Activity,真是没有对比就没有伤害啊。我再次重申,Kotlin,好用,炫酷,快来用(安利脸)
字数少了点,有机会再补全一下其他的互调的细节,所以加了个(一)。任何问题欢迎留言讨论。RUA。
转载自:https://juejin.cn/post/6844903599940730888