kotlin和java虽然100%互通,但是其实还是要注意一些问题,这里总结一下。
kotlin有顶层方法和属性,java没有,首先Test.kt文件中中定义的顶层方法以及属性
package kotlin
/*
* Created by TY on 2017/7/20.
*/
var name:String="";
const val name1="2";
fun test(){
}
fun main(args: Array<String>) {
}
在java中会自动生成一个TestKt类,直接调用即可。
package java;
import kotlin.TestKt;
/*
* Created by TY on 2017/7/28.
*/
class Main {
public static void main(String args[]) {
TestKt.test();
TestKt.setName("1");
String a =Hello.name1;
}
}
这里的const关键字的用法相当于public static final ,注意const的限制:
1.只要出现在最顶层或对象内部
2.只支持String与原始类型
3.无法算自定义getter
如果想指定生成的类名,要用到注解 @file:JvmName()
,放在package之前
@file:JvmName("Hello")
package kotlin
也就是要写成这样,剩下的就直接改变代码里的类名就可以了。
如果有AUtils.kt有一个a方法,BUtils.kt有一个b方法如果要协调成一个java类在java使用,在两个kt文件中添加
@file:JvmName("Utils")
@file:JvmMultifileClass
这样Java中就可以通过Utils.xx()来进行调用。
@JvmName("test1")
fun String.test() {
}
fun Int.test() {
}
同样可以通过JvmName来指定方法名字。
在Kotlin中声明A类
class A(name: String) {
//public final
//在java中具有与kotlin中一样的可见性
@JvmField val name = name
companion object Jvm {
val id = "2"
}
}
Java中调用
n = new A("1").name;
//使用kotlin伴生对象
A.Jvm.getId();
注释写的比较明确了就不过多解释了,如果伴生对象没用名字,java中默认是Companion。这个是类的伴生对象,对呀顶层的伴生对象。
object B {
val id = "1"
}
Java中调用是
//使用kotlin声明对象
B.INSTANCE.getId();
@JvmOverloads
fun func(name: String = "", id: Int = 1) {
}
注意这个注解,在java中会生成方法重载,方法调用我就不写了。
kotlin中抛出异常要在java中检验同样需要加注解
@Throws(IOException::class)
fun ex() {
throw IOException("")
}
Java调用这个方法时IDE就会提示抛出异常了。
javaClass
public class JavaClass {
public static void is() {
}
public static void object() {
}
public static void array(int[] a) {
array2(a);
}
public static void array2(int... a) {
}
public void invoke() {
}
}
首先是前面两个方法,方法名与关键字冲突,调用的时候要加上``
//使用由kotlin关键字为名字的方法或者属性
JavaClass.`is`()
JavaClass.`object`()
接着要注意的可变长参数的用法,传数组需要加上*
//java数组与可变长度参数
JavaClass.array(intArrayOf(1, 2, 3))
JavaClass.array2(*intArrayOf(1, 2, 3))
JavaClass.array2(1,2,2);
操作符重载的方法确定
//如果java定义的函数的函数名在kotlin当中与操作符重载方法的方法名一致 则可以使用操作符调用相应的java方法
val j = JavaClass()
j()
相当于调用了java类中的invoke()方法
jni的方法定义,external关键字
external fun sum(x: Int, y: Int): Int
总结到这里,实际场景几乎都包括了,到此结束。