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

来源:互联网 发布:操作系统调度算法代码 编辑:程序博客网 时间:2024/06/16 22:11

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中的默认参数

@JvmOverloadsfun 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

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

阅读全文
0 0
原创粉丝点击