Koltin - Koltin与Java互相调用

本文详细探讨了Kotlin与Java之间的互调,包括Kotlin如何调用Java的属性、方法、静态成员,以及Java如何调用Kotlin的包级函数、实例变量、类变量和类方法。讲解了SAM转换、JNI调用、反射机制,并针对类型转换、函数重载和泛型问题提出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Kotlin调用Java

1.1、属性

Kotlin调用属性实际上就是访问getter、setter方法,因此Java类只要提供了getter方法,Kotlin就可将其当成只读属性。如果Java类提供了getter、setter方法,Kotlin就可将其当成读写属性。

注:其实Java是否包含了成员变量不重要,关键是getter、setter方法。

如果getter方法的返回值类型是boolean,该getter方法名也以is开头,此时Kotlin会将其当成属性名与getter方法同名的属性。比如boolean.isMarried()方法可作为Kotlin的只读属性,该属性名为isMarried.

1.2、Java中的类名、方法名、接口名等是Kotlin的关键字,则需要进行转义(``)

public class InMethod{

public void in(){

}}

fun main(args:Array<String>)

var im  = InMethod()

im.`in`()

}

1.3、对Java数组的处理

Kotlin的数组是不支持型变的,因此Array<String>不能赋值给Array<Object>。但Java数组是支持型变的,因此String[]可以直接赋值给Object[]变量。

此外,Java还支持int[]、long[]等基本类型的数组,这种数组可以避免拆装箱带来的性能开销。但Kotlin的Array类是不支持这种基本数据类型的数组,为此,Kotlin提供了ByteArray、ShortArray、......数组,这几种数组专门用于代替Java的int[]、long[]等基本类型的数组。

1.4、调用参数个数可变的方法

public class JavaVarargs{

public void test(int...nums){}

}

Kotlin==>

val jv =JavaVarargs()

jv.test(3,5,6,2)

val intArr = intArrayOf(1,2,3,5)

//将数组解开成多个元素

jv.test(*intArr)

1.5、Object的处理

Java的Object对应Kotlin的Any,又因为Any只声明了toString()、equals()、hashCode()方法,如何使用Object类中其他方法?

  • wait/notify/notifyAll

先转型再调用:(foo as java.lang.Object).wait()

  • getClass

obj::Class.java或obj.javaClass

  • clone

如果要让一个对象重写clone方法,则需要让该类实现kotlin.cloneable接口。

class Example:kotlin.cloneable{

override fun clone():Any{

}}

1.6、访问静态成员

Java类中的静态成员可以通过伴生对象的语法调用。

java.awt.BorderLayout.NORTH//访问java.awt.BorderLayout的NORTH静态成员(就像访问伴生对象的属性一样)

1.7、SAM转换(利用Lambda表达式来作为函数式接口的实例)

//使用Lambda表达式来创建函数式接口(Runnable)的对象

var  r  = Runnable{

。。。。。

}

1.8、Kotlin中调用JNI

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值