Android开发者快速上手Kotlin(九) 之 Kotlin与Java混合开发

接《Android开发者快速上手Kotlin(八) 之 协程官方框架Channel、Select和Flow》文章继续。

16 Kotlin与Java混合开发

我们在前面介绍语法文章里或多或少有提到过可以使用一些如@JvmXX的注解来解决默认参数、静态成员等Kotlin和Java的兼容问题以及属性、空指针安全、反射等语法的区别和使用。今天我们就来进行一个全面的总结关于Kotlin和Java共存混合开发的各种情况。

16.1 属性读写

其实Java中并没有属性的概念,它并不是语法的规则,只是通过Getter和Setter约定来实现属性的逻辑。而在Kotlin是存在真正意义上的属性,所以在Kotlin里会自动识别Java的Getter和Setter。 同样道理,将Kotlin转成Java后会自动生成Getter和Setter。

更多Kotlin属性介绍

16.2 空类型安全

Kotlin中不区分装箱类型和基本类型,而且Kotlin中任意类型都有可空和不可空两种情况(默认不可空),若需要为空的情况,需要在类型后面加一个问号”?”。所以如果在Kotlin里想操作Java的代码时就会遇到一个平台类型,如果Java中返回的类型是String,那么IDE就会提示其类型是String!(带感叹号的类型实质上是不存在的,仅为IDE提示),当然我们在Android平台上开发的话,返回String?,因为它可为空或者不为空,这时需要开发者进行明确判断。当然也可以在Java中通过注解@Nullable和@NotNull来明确返回类型是否为空来弥补这一点。

更多Kotlin空类型安全介绍

16.3 包级函数

Kotlin包级函数就是直接在包下写函数,不需要像Java那样一定需要在类内。在编译时Kotlin的包级函数会生成一个类,而此类包含了所有包级函数,在Java看来这些都是静态方法。例如Kotlin中Utils.kt里有一个getAbc的包级函数,那么在Java中使用UtilsKt.getAbc()就可以调用。

16.4 伴生对象(@JvmStatic和@JvmField)

Kotlin使用静态方法时,建议使用包级函数,就是直接在包下写函数,不需要在类里写方法。但是如果一定需要像Java一样在类里的静态方法,可以使用伴生对象。但是伴生对象在Java中的调用会多出一个Companion的单例,如果在Java中也希望可以像平时调用单例一样调用,可以对伴生对象中的函数加上@JvmStatic注解以及对属性加上@JvmField注解。

更多Kotlin伴生对象介绍

16.5 扩展方法和运算符重载

扩展方法对Java而言就是多出一个Receiver作为参数的静态方法。

运算符重载对Java而言就是多出一个Receiver作为参数且对应名称的静态方法。

更多Kotlin扩展方法和运算符重载介绍

16.6 默认参数(@JvmOverloads)

Java中只有重载没有默认参数,所以在Kotlin写默认参数时希望Java也能享受此特性的话,应该加上@JvmOverloads注解标注该函数,这样在Java中就会生成多个相应的重载方法。

更多Kotlin默认参数介绍

16.7 指写编译类名(@file:JvmName)

正如前面介绍包级函数,我们如果需要调用Utils.kt文件里的getAbc包级函数的话,在Java中会生成一个UtilsKt的类,因为默认的命名就是xxKt。如果希望可以自定义其类名,只需要在文件最上面添加一个注解,@file:JvmName("xxxName") 就可以指定编译后的名字。

16.8 data数据类和NoArg/AllOpen

在Kotlin中使用data关键字声明类是数据类,它用于保存数据。但是由于data class要身的特性,它是final声明的,而且没有默认无参数的构造方法,像如果使用Gone需要序列化和反序列化是非常大的障碍,所以官方推出了NoArg插件为被标注的类生成无参构造方法和AllOpen插件可以去掉final的声明使类允许被继承。

更多Kotlin类据类介绍

16.9 泛型

Kotlin和Java中的泛型区别不大,仅在于语法关键字上,比如:

  1. 通配符Kotlin的*对应Java的?
  2. 协变和逆变Kotlin的out/in对应Java的extends/super

更多Kotlin泛型介绍

16.10 SAM转换

SAM全称是Single Abstract Method,Kotlin中SAM转换是有条件的:必须是Java代码且仅有一个方法的接口。

更多Kotlin SAM转换介绍

16.11 反射

Kotlin依然可以使用Java的那套Type、Class、Field、Method反射对象;但其实Kotlin自身语法也支持了一套新的,它们对应KType、KClass、KProperty、KFunction。

更多Kotlin 反射介绍

16.12 正则表达式

Kotlin兼容Java的Pattern类使用正则表达式,同时也有自己专门处理正则表达式的类Regex。

更多Kotlin 正则表达式介绍

16.3编码切换查询对应关系

我们在最开始第一篇文章也提到,如果在开发过程中,希望查看Kotlin的编码或跟Java语法的对应关系,可以在【Tools】-【Kotlin】-【Show Kotlin Bytecode】中再点击【Decompile】查看,如:

Android开发者快速上手Kotlin(九) 之 Kotlin与Java混合开发_第1张图片

 

 

未完,请关注后面文章更新…

 

 

你可能感兴趣的:(Kotlin)