Java 调用 Kotlin
1、kotlin编译后会生成一个 类名 + Kt
,如果不想使用这个名字,可以自己自定义
在文件第一行添加注解 @file:JvmName("名字")
例如 @file:JvmName("Hello")
2、访问顶层属性
var name = "1"
通过 文件名Kt
来调用set/get方法
String name = JavaClassKt.getName();
如果想直接通过 “文件名.属性名” 的方式
方法一: 通过添加@JvmField属性可以做到
@JvmField var name1 = "1" 那么在java里 就可以 String name1 = JavaClassKt.name1;
方法二: 使用
const
关键字// const 只能用来修饰 val ,相当于java中的 public static final const val name2 = "1" Stringg name2 = JavaClassKt.name2;
3、合并文件
假如有
AUtils.kt,里面有个 a 方法
和
BUtils.kt,里面有个 b 方法
给AUtils.kt设置名字叫Utils(通过@file:JvmName("Utils"))
给BUtils.kt设置名字叫Utils(通过@file:JvmName("Utils"))
这个时候通过Utils调用方法的时候只能调用 a 方法,但是我还想要调用 b 方法
就需要在 @file:JvmName("Utils") 下面添加 @file:JvmMultifileClass,表示可以合并
在AUtils.kt 和 BUtils.kt 里面都添加
4、扩展方法
fun String.test() {}
fun Int.test() {}
在java 中调用的时候需要通过 文件名.test(参数就是扩展类型)
比如
Hello.test("string");
Hello.test(1);
5、相同签名的不同泛型的方法
fun List<String>.test() {}
fun List<Int>.test() {}
上面这两个方法因为java中的签名一样,都是List,所以有问题
就需要修改下方法名
@JvmName("test1")
fun List<String>.test() {}
fun List<Int>.test() {}
java
中调用
// 相同签名的不同泛型
Hello.test(new ArrayList<Integer>());
Hello.test1(new ArrayList<String>());
6、方法默认值
fun func(name: String = "", id: Int = 1) {}
kotlin中两个参数都有默认值,在java中调用的话两个参数都需要传
如果在 java
中不传参数的话需要添加注解
@JvmOverloads
fun func(name: String = "", id: Int = 1) {}
这个时候就可以调用了
// 有默认值的方法
Hello.func();
Hello.func("");
Hello.func("", 1);
7、类
class A(name: String) {
val name1 = name
@JvmField
val name2 = name
companion object AA {
val id = "2"
@JvmField
val sex = "男"
}
}
java
中调用
// 类
A a = new A("name");
n = a.getName1();
n = a.name2;
String id = A.AA.getId();
String sex = A.sex;
8、object
object B {
val id = "1"
}
java
中调用
// object
id = B.INSTANCE.getId();
9、异常
fun ex() {
throw IOException("xxx")
}
在 kotlin
中抛出异常,java
中是没有提示要处理的,如果需要提示可以添加注解
@Throws(IOException::class)
fun ex() {
throw IOException("xxx")
}
java
中
// 异常
try {
Hello.ex();
} catch (IOException e) {
e.printStackTrace();
}