快速上手 Kotlin 开发系列之与 Java 互调 (2)

本节将介绍 Kotlin 和 Java 互调过程中封装类、空值敏感以及静态变量和静态方法的处理

Kotlin 没有封装类

首先看看以下代码。

我们用 Java 创建一个接口,如下:

快速上手 Kotlin 开发系列之与 Java 互调 (2)

之后我们创建一个 A.java 实现这个接口,并在每个方法中打印对应的类型,int 和 Integer。

快速上手 Kotlin 开发系列之与 Java 互调 (2)

最后,我们在 Kotlin 代码中调用它,我们来看下它的执行结果:

快速上手 Kotlin 开发系列之与 Java 互调 (2)

快速上手 Kotlin 开发系列之与 Java 互调 (2)

你会发现只调用了 int 参数的方法,通过这个示例可以看出来 Kotlin 是没有封装类的概念的,为了进一步说明,我们让 Kotlin 的类来实现这个接口:

快速上手 Kotlin 开发系列之与 Java 互调 (2)

你会发现编译器会报方法名重复的错误,删掉后正常

上述例子中如果非要调用 Integer 参数的方法,当然也是能做到的,可以通过反射的方法。

Kotlin 空值敏感

还是通过一个示例来说明,写一个包含如下静态方法的 Java 类:

快速上手 Kotlin 开发系列之与 Java 互调 (2)

之后在 Kotlin 代码中调用这个方法,其中赋值方式有三种,分别是让编译器推断、赋值给不为空的 String 类型以及赋值给可为空的 String? 类型。

快速上手 Kotlin 开发系列之与 Java 互调 (2)

首先看第一种编译器推断类型的方式,当我们使用编译器查看类型时你会发现它返回的是 String! 的类型,这种类型我们不能直接声明,这是 Kotlin 与 Java 互调时的一种特有的类型,也可以说成是 Java 的 String 类型。

快速上手 Kotlin 开发系列之与 Java 互调 (2)

之后我们执行 main 函数,看到代码 10 行位置报错,说明为空的值给不可为空的 String 类型赋值会报错!

快速上手 Kotlin 开发系列之与 Java 互调 (2)

当我们注释掉 fmt2 代码继续执行,你会发现编译器会正常编译通过,难道这就说明第 1、3 种方式是可靠的呢?我们尝试调用 fmt1 的某个方法:

快速上手 Kotlin 开发系列之与 Java 互调 (2)

快速上手 Kotlin 开发系列之与 Java 互调 (2)

发现会报 NullPointerException 错误。为什么会这样呢? 因为 String! 类型 Kotlin 编译器会认为这是兼容类型,你只能是临时地使用,但是如果你调用它的话,就会像 Java 一样去执行,所以就报了 Java 的空指针异常。

反观 fmt3 就不会报错,这就是 Kotlin 的空安全!

【注】当我们调用 Java 的方法返回类对象的时候,如果你不确定返回值是否可能为空,你一定要赋值给一个可空类型,这样才能利用 Kotlin 的空安全!

Kotlin 没有静态变量与静态方法

由于 Kotlin 中没有静态变量和静态方法,我们可以通过上一节中提到的 object 关键字声明的类来间接实现类似 Java 中的静态方法。

快速上手 Kotlin 开发系列之与 Java 互调 (2)

快速上手 Kotlin 开发系列之与 Java 互调 (2)

如果让其变成真正的静态方法,可以通过使用 @JvmStatic 注解使其变成 Java 的静态方法,这时就可以直接在 Java 类中调用。

快速上手 Kotlin 开发系列之与 Java 互调 (2)

快速上手 Kotlin 开发系列之与 Java 互调 (2)

以上就是本节内容,欢迎大家关注~


分享到:


相關文章: