如果你之前使用 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()

但是如下代码即使混淆后也是可以完全正常执行的

  1. var s = some?.s ?: ""

  2. var s = some.d ?: ""

  3. var list = some?.data?.list:klist

  4. 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 中使用了这些关键字,需要加上反引号(`)转义来避免冲突。例如

  1. // Java 代码中有个方法叫 is()

  2. public void is(){

  3. //...

  4. }

  5. // 转换为 Kotlin 代码需要加反引号转义

  6. fun `is`() {

  7. //...

  8. }

3.3 在 Java 中调用 Kotlin 代码

3.3.1 static 方法

上文已经提到过,在 Kotlin 中没有 static关键字,那么如果在 Java 代码中想要通过类名调用一个 Kotlin 类的方法,你需要给这个方法加入@JvmStatic注解(这个注解只在 jvm 平台有用)。否则你必须通过对象调用这个方法。

  1. StringUtils.isEmpty("hello");

  2. StringUtils.INSTANCE.isEmpty2("hello");

  3. object StringUtils {

  4. @JvmStatic fun isEmpty(str: String): Boolean {

  5. return "" == str

  6. }

  7. fun isEmpty2(str: String): Boolean {

  8. return "" == str

  9. }

  10. }

如果你阅读 Kotlin 代码,应该经常看到这样一种写法。

  1. class StringUtils {

  2. companion object {

  3. fun isEmpty(str: String): Boolean {

  4. return "" == str

  5. }

  6. }

  7. }

companion object表示外部类的一个伴生对象,你可以把他理解为外部类自动创建了一个对象作为自己的field
与上面的类似,Java 在调用时,可以这样写:StringUtils.Companion.isEmpty();(1.1以后可以省略中间的 Companion,写作 StringUtils.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 和java 混编相关推荐

  1. flutter java混编_有赞 Flutter 混编方案

    背景 目前准备试水 Flutter,但是多数native开发是不了解Flutter,因此需要设计一种比较"舒服"的集成方式. 混编方案 方案考量 如果直接采用 Flutter 工程 ...

  2. 解决了java+matlab混编+web(jsp)调用Matlab,网页中显示Figure,详细实例

    例子简介 网上java+matlab混编的挺多,大多数实例也都能实现出来,但是将matlab生成出来Figure显示在jsp页面中并配合WebFigure实现的例子却很少,所以我将自己的尝试结果详细的 ...

  3. Kotlin与java的纠缠史

    1. 背景 Jetbrains早在2010年推出Kotlin,在今年(2017)5月18,谷歌在今日举行的I/O开发者大会上宣布,将Kotlin语言作为安卓开发的一级编程语言,这个可爱的语言可于Jav ...

  4. 百度App Objective-C/Swift 组件化混编之路(一)

    作者丨郭金.陈佳 来源丨百度App技术 一. 背景 1.1 Swift 发展历史 2010 年 7 月,克里斯(Chris Lattner)开始设计 Swift.完成基础架构后,克里斯带领开发小组陆续 ...

  5. Swift与C++混编 OpenCV初体验 图片打码~

    OpenCV初体验,给图片打码 提到OpenCV,相信大多数人都听说过,应用领域非常广泛,使用C++开发,天生具有跨平台的优势,我们学习一次,就可以在各个平台使用,这个还是很具有诱惑力的. 本文主要记 ...

  6. html js php 混编,Razor标记语言和HTML,js混编

    Razor Razor 是asp.net mvc下的一种前端标记语法类似jquery 以及PHP或者java的jsp中的标记语法,但是更加优雅和方便.逻辑都是后端代码.在这里我用的是C#,对于前端小白 ...

  7. 入门 Kotlin 和 Java 混合开发

    一.前沿 如果你学习过其他的编程语言,你就会发现 Java 的语法很是哆嗦,可是我们为什么没有放弃 Java 这门编程语言呢?因为 JVM 是一个非常好的平台,而且 Java 程序员目前在中国所占的比 ...

  8. java:数字转string 报空指针_超干货详解:kotlin(4) java转kotlin潜规则

    前言 以一个java老鸟的角度,如何去看 kotlin. Java源代码应该如何用Kotlin重构. 如何正确学习kotlin并且应用到实际开发中.本文将会探究. 本文分两大块,重难点和潜规则. 重难 ...

  9. 设计模式混编:观察者模式+中介者模式

    针对变化万千的业务需求,采用合适的设计模式是可以轻松应对的. 本文将探索多种优秀设计模式的混编来解决复杂场景的问题,实现1+1>2的效果.应用实践离不开基础,所以文章将以基本概念.设计初衷出发, ...

最新文章

  1. R语言使用ggplot2包的快速可视化函数qplot绘制密度图(主题、轴标签设置)实战
  2. 图标尺寸规范_作为刚入门的UI设计师,你需要懂哪些设计规范?
  3. 突然开掉CEO!通用电气时隔一年再换帅,金融和工业互联网都救不了GE?
  4. CSS实现各类分栏布局
  5. 惠普服务器年销售额,IBM和惠普去年分列服务器收入和发货量第一
  6. Django congtent types应用
  7. python数据分析开发环境_在MAC上搭建python数据分析开发环境
  8. pythonxml读写_python xml读取和写入
  9. mysql存储过程中in条件多个值,使用临时表解决
  10. java fx能不能添加到swing中_java写个记事本
  11. 【Essay】开始研究生小论文的撰写
  12. (转) SpringBoot非官方教程 | 第一篇:构建第一个SpringBoot工程
  13. 原生安卓10怎么打开面部识别_安卓手机运行慢怎么办?只需简单一步立即提速翻倍...
  14. MIDI文件基础及使用Python库mido操作MIDI文件
  15. eclipse导入源文件后还是不能查看源代码的解决办法
  16. python小技巧之:同时安装py2和py3,如何在指定的版本下pip安装包
  17. 求最小公倍数的三种方法(C语言)
  18. (二)代理模式详解(包含原理详解)
  19. 支持语音记事的便签怎么将声音文件转文字保存
  20. EventTarget.addEventListener()事件监听

热门文章

  1. 浸会大学计算机专业硕士排名2019,2019软科世界大学学术排名香港浸会大学排名第701-800...
  2. php mysql需要服务器配置_php服务器配置(php+mysql+iis)步骤
  3. 华为鸿蒙系统不卡,华为鸿蒙系统,到底能不能取代安卓?网友:细节决定成败...
  4. 收集bug开源框架_划重点 | 小程序框架全面测评
  5. python交互式shell_交互式 shell 玩转 Python
  6. php面向对象代码_PHP面向对象之抽象类详解(代码实例)
  7. brew php mysql_MAC下用homebrew安装及配置apache、php和mysql
  8. ubuntu导入第三方库_在Ubuntu中,如何添加Apt存储库
  9. 添加到package_pycharm里面添加镜像库
  10. 在python中用import或者from_[转]python基础之---import与from...import....