Java和Kotlin互相调用需要注意的问题

kotlin和java虽然100%互通,但是其实还是要注意一些问题,这里总结一下。

Java调用Kotlin

顶层函数和属性

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中的类

在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();

kotlin中的默认参数

@JvmOverloads
fun func(name: String = "", id: Int = 1) {

}

注意这个注解,在java中会生成方法重载,方法调用我就不写了。

kotlin中的异常

kotlin中抛出异常要在java中检验同样需要加注解

@Throws(IOException::class)
fun ex() {
    throw IOException("")
}

Java调用这个方法时IDE就会提示抛出异常了。

Kotlin调用Java

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

总结到这里,实际场景几乎都包括了,到此结束。

你可能感兴趣的:(Android笔记)