侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 274 篇文章
  • 累计创建 55 个标签
  • 累计收到 74 条评论

Kotlin 与Java的常见数据映射关系与调用时注意事项

Z同学
2022-06-06 / 0 评论 / 0 点赞 / 54 阅读 / 2,178 字
温馨提示:
本文最后更新于 2022-06-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

介绍Kotlin中与Java 的一些常见类的关系转换,方便进行两者混合编码时造成的问题。

同时了解一下两者之间调用时的注意事项。

1. 映射

Kotlin最终还是会编译成字节码在JVM中进行运行,所以Kotlin的一些数据会被直接编译为java中的各种数据类型。

但是由于Kotlin会进行空值验证。所以我们转换关系时要注意。下面通过表格列一些相关映射

1.1 基本数据类型

基本类型下都是不为空的。

java类型 Kotlin类型
byte kotlin.Byte
short kotlin.Short
int kotlin.Int
long kotlin.Long
char kotlin.Char
float kotlin.Float
double kotlin.Double
boolean kotlin.Boolean

而包装类是可以为空的,所以包装类转换Kotlin时会变成可空对象。

java类型 Kotlin类型
Byte kotlin.Byte?
Short kotlin.Short?
Integer kotlin.Int?
Long kotlin.Long?
Character kotlin.Char?
Float kotlin.Float?
Double kotlin.Double?
Boolean kotlin.Boolean?
String kotlin.String!

1.2 常用类

java类型 Kotlin类型
Object Any!
Cloneable Cloneable!
Comparable Comparable!
Enum Enum!
Annotation Annotation!
Number Number!
Deprecated Deprecated!
Throwable Throwable!
CharSequence CharSequence!

针对各种集合和数组,Kotlin中包括了可变与不可变,但是在java中是没有这种区分的。

java类型 Kotlin不可变类型 Kotlin可变类型
Iterator<T> Iterator<T> MutableInterator<T>
Iterable<T> Iterable<T> MutableIterable<T>
Collection<T> Collection<T> MutableCollection<T>
Set<T> Set<T> MutableSet<T>
List<T> List<T> MutableList<T>
Map<K,V> Map<K,V> MutableMap<K,V>
Map.Entry<K,V> Map.Entry<K,V> MutableMap.MutableEntry<K,V>

上面只是列了一些常见的并不代表全部。

2. 互相调用

Kotlin和java两者之间还是有一些差异的,但是由于Kotlin在设计之初就考虑到了java的调用。所以使用Kotlin调用java非常简单,但并不代表调用时我们可以随心所欲,还是有一些注意事项的。

2.1 Kotlin调用java

我们在使用Kotlin进行调用java的时候,虽然简单,但是还是有很多细节是需要注意的,下面列一些注意事项

  • 避免Kotlin关键字:例如java命名对象为object时,在kotlin中就是一个关键字了,还有in等等。(这些关键字调用时需要添加反引号进行标注才能正确调用)。
  • 空值的注意:java方法返回的类型可能是空也可能不为空。那么我们在Kotlin进行接收对象时就要进行声明。如果申明为非空那么接受到可空传值,就会出现异常了。
  • 异常检查:java有受检查异常,而kotlin中没有受检查异常。要注意两者的异常处理机制。

当然还有更多细节事项,这里只是列了几个常见情况。

2.2 java调用Kotlin

在java中调用Kotlin就要相对复杂了,因为kotlin很多特性是java所没有的。下面列一些注意事项

  • 通过get和set函数访问Kotlin属性:正常情况下var声明的属性两个方法都有,但是val声明的是可读属性是没有set函数的。
  • 访问包级别成员:kotlin中定义的同一个包下面的文件可能并不在同一个类。java访问时需要将它们当做静态成员访问,但是源码看的时候可能就不在一个类文件里面了。需要注意差异。
  • 实例字段,静态字段和静态函数:如果需要在java中以实例字段访问Kotlin中对的属性,那么kotlin源码中需要加上@JvmField注解字段才行,如果是想将Kotlin中的函数以java中的静态函数进行访问,那么Kotlin源码中需要给函数添加上@JvmStatic注解才行。
  • 权限控制:Kotlin的类访问权限和java访问权限都是四种但是两者之间有差别的。目前java不能访问Kotlin内部可见性类成员,但是可以访问内部可见的类和可见的顶层成员。
  • 重载函数:kotlin函数可以设置默认值实现多重重载,但是java中并不支持参数默认值,只支持全部参数函数。如果想实现,那么我们需要在Kotlin的源码中添加@JvmOverloads注解。但是该注解不能使用在抽象函数中。
0

评论区