Kotlin开发语言学习(3)Kotlin与Java混编
来源:互联网 发布:淘宝印度神油是真的吗 编辑:程序博客网 时间:2024/05/17 22:50
虽然 Kotlin 的开发很方便,但当你与他人协作时,总会碰到 Java 与 Kotlin 代码共存的代码项目。
本章就教你如何优雅的实现 Kotlin 与 Java 混合编程。
3.1 直接转换
3.1.1 将 Java 转换为 Kotlin
如果你之前使用 Java 语言而没有 Kotlin 开发经验,不用担心,Intellij IDEA 会帮你一键转换,将 Java 代码转换成 Kotlin 代码(但是反过来就不行了)。
在 Mac 上,系统默认的快捷键为control+shift+command+K
,这个组合键实在有点反人类,建议你自定义一个你觉得舒服的快捷键。
快捷键可以通过你的编译器 keymap 中修改:command+,
-> 搜索keymap
-> 右侧搜索kotlin
,可以查看到Convert Java File to Kotlin File
项。
3.1.2 注意 Class 调用
在 Java 或 Android 开发中,经常会直接调用一个类的 Class 文件。但是当你用上文介绍的转换方法去转换 XXX.class
这样的代码时,是无法直接转换的(也许未来会修复这个问题,但目前你扔需要手动修改)。在 M13 之前,Java 中的XXX.class
对应 Kotlin 代码中的JavaClass<XXX>
,而 M13 之后写法已被改为XXX::class.java
。
3.1.3 Android proguard 的坑
注:我们团队遇到过这样的一个坑,在 Android 开发的时候,如下代码会在混淆以后,发生异常
var str = some?.s?.d ?: ""
这段代码在正常debug模式编译运行完全正常,但是一旦执行混淆,就会发生所在函数被移除的现象。
但是如果改写为以下写法就能正常运行:
var str = some?.s?.d ?: String()
猜想应该是 proguard 不知道如何处理这段代码,无法识别出最后两个引号是一个String
,最后直接将整个函数移除掉了。
同样的代码还有:
var list = some?.data?.list:mutableListof()
但是如下代码即使混淆后也是可以完全正常执行的
var s = some?.s ?: "" var s = some.d ?: ""var list = some?.data?.list:klist var data = some?.data ?: return
3.1.4 开发 Android library 的建议
如果你是开发 Android library 程序,建议你不要使用 Kotlin 代码。因为作为 library,如果使用它的工程是纯 Java 完成的,引入后会额外增大 200k 左右大小,同时它有可能会造成某些情况下编译异常。
3.2 在 Kotlin 中调用 Java 代码
3.2.1 返回 void 的方法
如果一个 Java 方法返回 void,对应的在 Kotlin 代码中它将返回 Unit。关于 Unit,本书将在 第五章函数
部分着重讲解。
现在你只需要知道在Java 中返回为 void 的函数,在 Kotlin 中可以省略这个返回类型。
3.2.2 与 Kotlin 关键字冲突的处理
Java 有 static 关键字,在 Kotlin 中没有这个关键字,你需要使用@JvmStatic
替代这个关键字。
同样,在 Kotlin 中也有很多的关键字是 Java 中是没有的。例如 in
,is
,data
等。如果 Java 中使用了这些关键字,需要加上反引号(`)转义来避免冲突。例如
// Java 代码中有个方法叫 is()public void is(){//...}// 转换为 Kotlin 代码需要加反引号转义fun `is`() { //...}
3.3 在 Java 中调用 Kotlin 代码
3.3.1 static 方法
上文已经提到过,在 Kotlin 中没有 static
关键字,那么如果在 Java 代码中想要通过类名调用一个 Kotlin 类的方法,你需要给这个方法加入@JvmStatic
注解。否则你必须通过对象调用这个方法。
StringUtils.isEmpty("hello"); StringUtils.INSTANCE.isEmpty2("hello");object StringUtils { @JvmStatic fun isEmpty(str: String): Boolean { return "" == str } fun isEmpty2(str: String): Boolean { return "" == str }}
如果你阅读 Kotlin 代码,应该经常看到这样一种写法。
class StringUtils { companion object { fun isEmpty(str: String): Boolean { return "" == str } }}
companion object
表示外部类的一个伴生对象,你可以把他理解为外部类自动创建了一个对象作为自己的field
。
与上面的类似,Java 在调用时,可以这样写:StringUtils.Companion. isEmpty();
关于伴生对象,我们将在下一章 类与对象
详细讲解。
3.3.2 包级别函数
与 Java 不同,Kotlin 允许函数独立存在,而不必依赖于某个类,这类函数我们称之为包级别函数(Package-Level Functions)。
为了兼容 Java,Kotlin 默认会将所有的包级别函数放在一个自动生成的叫ExampleKt
的类中, 在 Java 中想要调用包级别函数时,需要通过这个类来调用。
当然,也是可以自定义的,你只需要通过注解@file:JvmName("Example")
即可将当前文件中的所有包级别函数放到一个自动生成的名为 Example 的类中。
3.3.3 空安全性
在 Java 中,如果你调用的 kotlin 方法参数声明了非空类型,如果你在 Java 代码中传入一个空值,将在运行时抛出NullPointerException
。其内部原因在于 Kotlin 为每个非空类型加了断言,如果传入空值则会立刻抛出异常。
同样,如果你使用 null 对象去调用一个 kotlin 方法,将会立刻抛出NullPointerException
(就算是调用普通 java 方法也是一样会抛出 NullPointerException )
- Kotlin开发语言学习(3)Kotlin与Java混编
- Kotlin Primer·第三章·Kotlin 与 Java 混编
- kotlin 和java 混编
- Kotlin开发语言学习(1) kotlin初探与相关配置
- Kotlin开发语言学习(5) 函数与闭包
- Android开发,Kotlin的了解与学习(八)-----kotlin与java的互相调用
- Kotlin学习笔记(二):Kotlin与Java对比
- Kotlin语言学习之AndroidStudio集成Kotlin开发环境
- Android开发,Kotlin的了解与学习(二)-----Kotlin数据类型与Extensions的学习
- Kotlin学习(3)
- Kotlin开发Android笔记2:Kotlin与Java简单比较
- Kotlin开发Android笔记2:Kotlin与Java简单比较
- Kotlin开发语言学习(2)基本语法
- Kotlin开发语言学习(4) 类特性
- Kotlin开发语言
- android kotlin与 Java 语言比较
- Kotlin开发Android笔记3:Kotlin中类与函数
- Kotlin开发Android笔记3:Kotlin中类与函数
- 关于phpcms根目录下ico图标,改了没效果的解决办法?
- 阿里云RDS数据恢复到本地MySQL数据库
- JavaScript中数组对象详解
- 游戏动画中欧拉角与万向锁的理解
- android自定义View探索2
- Kotlin开发语言学习(3)Kotlin与Java混编
- WebRtc部署
- 额。在js中拼写onclick无效
- 指针与堆内存
- 使用sklearn进行集成学习——理论
- yolo配置文件理解
- Kotlin开发语言学习(4) 类特性
- 使用Flask-Mail和qq邮箱SMTP服务发送邮件
- jsp(二)