对于以前的Java老项目,想要使用kotlin,全部转换带来的成本代价太大了,而官方也提供了慢慢过渡到kotlin的方法,使得Java和kotlin可以互通
一、互操作性和可空性
1.Java中所有的对象都可能为空
操作Java对象时,我们有必要加上判空符 Java:
代码语言:javascript复制public class MyClass {
public String value;
public String getCanNullValue(){
return value;
}
}
kotlin:
代码语言:javascript复制fun main() {
val my = MyClass()
val value = my.getCanNullValue()
println(value?.capitalize())
}
2.类型映射
代码运行时,所有的映射类型都会重新映射成原来的Java类型
代码语言:javascript复制fun main() {
val my = MyClass()
my.value = "a123"
val value = my.getCanNullValue()
println(value.javaClass)
}
结果: class java.lang.String
二、属性、异常互操作
1.属性访问
我们可以直接使用 "= " 对Java属性进行赋值了,对于受保护的属性,Java类需要实现对应的get、set方法 Java:
代码语言:javascript复制public class MyClass {
private String value;
public String getCanNullValue(){
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
kotlin:
代码语言:javascript复制fun main() {
val my = MyClass()
my.value = "a123"
}
2.@JvmName
kotlin顶层函数,在Java中都被当作静态方法 kotlin:
代码语言:javascript复制package com.aruba.mykotlinapplication.jtok
fun getKotlinMessage(): String {
return "hello, i'm kotlin"
}
Java:
代码语言:javascript复制package com.aruba.mykotlinapplication.jtok;
public static void main(String[] args) {
System.out.println(JtokKt.getKotlinMessage());
}
如果你不满意kotlin在Java中的类名,可以使用@JvmName修改它 kotlin:
代码语言:javascript复制@file:JvmName("MyKotlin")
package com.aruba.mykotlinapplication.jtok
fun getKotlinMessage(): String {
return "hello, i'm kotlin"
}
这样在Java中就可以用MyKotlin调用getKotlinMessage函数了
3.@JvmField
在Java中不能直接访问kotlin类的属性,必须调用get方法,如果想要直接使用可以在kotlin的属性上面加上@JvmField注解
代码语言:javascript复制class JavaToKotlin {
@JvmField
val info = "Hello"
}
4.@JvmOverloads
kotlin函数中可以给入参默认值,然后调用的时候不必传入,Java不行,如果想要Java调用时,也支持,使用@JvmOverloads注解,它会帮助kotlin产生函数的重载版本 kotlin:
代码语言:javascript复制@JvmOverloads
fun prinltInfo(name: String, age: Int = 1) {
println("$name $age")
}
Java:
代码语言:javascript复制 public static void main(String[] args) {
MyKotlin.prinltInfo("jack");
MyKotlin.prinltInfo("jack", 20);
}
5.@JvmStatic
@JvmField注解还能使Java用来以静态方式获取伴生对象的属性 @JvmStatic则允许Java直接调用伴生对象的函数
代码语言:javascript复制class JavaToKotlin {
@JvmField
val info = "Hello"
companion object {
@JvmField
val max: Int = 200
@JvmStatic
fun loadConfig(): String {
return "loading config"
}
}
}
6.@Throws
Java和kotlin存在异常处理的差异,使用@Throws,可以让Java知道如何处理异常 kotlin:
代码语言:javascript复制@Throws(IOException::class)
fun throwException() {
throw IOException()
}
kotlin中调用Java可能会出现异常的方法,则可以直接使用try catch
三、函数类型
Java中没有函数类型,所以,在Java里,kotlin函数类型使用FunctionN这样的名字的接口来表示,N代表入参的个数,一共有24个这样的接口,从Function0到Function23,每个接口都包含一个invoke函数,调用匿名函数需要调用invoke kotlin:
代码语言:javascript复制val funcp: (String) -> String = {
it.capitalize()
}
Java:
代码语言:javascript复制 public static void main(String[] args) {
Function1 funcp = MyKotlin.getFuncp();
System.out.println(funcp.invoke("abc"));
}