前言
介绍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
注解。但是该注解不能使用在抽象函数中。
评论区