Java与Kotlin互调原理

网友投稿 372 2022-08-27


Java与Kotlin互调原理

目录一、Kt调用-java参数非null的处理@NotNullKotlin中调用二、Kt调用-Java中使用kt关键字声明的变量和方法Kotlin中调用三、Kt调用Java-SAM转换在Kotlin中调用四、Kt中禁止Java调用某方法@JvmSynthetic五、Java调用Kt-扩展函数@file:JvmName(“xx”)六、Java调用kt-成员变量@JvmFieldKotlin@get:JvmName,@set:JvmNameKotlin七、Java调用Kt-伴生对象@JvmStaticKotlin八、Java调用Kt-方法默认参数值@JvmOverloadskotlin在java中调用

一、Kt调用-Java参数非null的处理

@NotNull

class TestJava {

public void toNotNull(@NotNull String title) {}

public void toNull(String title){}

}

Kotlin中调用

二、Kt调用- Java中使用kt关键字声明的变量和方法

kotlin中调用java方法,参数时,如果含有Kotlin关键字,必须增加 反引号 ``

public Object object;

//使用kotlin中关键字命名的方法

public void is() {

}

Kotlin中调用

testJava.`is`()

testJava.`object`

三、Kt调用Java-SAM转换

在Kotlin中调用带有接口参数的方法时,如果这个接口只有一个方法,那么就可以通过 lambda 表达式实现 SAM转换,从而简化我们的代码。

示例如下:

public class TestPIDIFsZtKiJavaSam {

void singleFun(@NotNull IListener iListener) {}

void noParameter( @NotNull IListener iListener,int sum) {}

void noParameterClean(int sum,@NotNull IListener iListener) {}

}

interface IListener {

void onClick();

}

在Kotlin中调用

fun main() {

val sam = TestJavaSam()

sam.singleFun {

}

sam.noParameter({

//如果更改一下java方法参数的顺序,那么就会更简洁,如下

},123)

sam.noParameterClean(123){

}

}

四、Kt中禁止Java调用某方法

@JvmSynthetic

在Kotlin中,有些方法并不想暴露给Java调用,这时就可以增加这个注解在方法上。

@JvmSynthetic

fun toMain() {

}

此时toMain() 在Java中将无法调用到。

五、Java调用Kt-扩展函数

@file:JvmName(&ldquohttp://;xx”)

在java中使用Kotlin的扩展函数时,我们都会使用相应的类名+Kt 去调用相关的方法,有时候我们想自定义相应的工具类,就显得稍显麻烦,如下:

比如我们有一个顶级扩展函数,位于 UiExpand.kt 中:

fun Int.px() {}

**Java中调用 **

//Java调用kotlin类-(UiExpand)-Int.px() 扩展方法

UiExpandKt.px(20);

如上所示,在Java中调用时,我们必须已文件名+kt后缀才可以调用。

通过给 UiExpand.kt 包名上增加 @file:JvmName(“Ui”),我们就可以实现自定义生成的类名去调用

如下:

Ui.px()

六、Java调用kt-成员变量

@JvmField

在Java中,我们去调用Kotlin 的 成员变量 时,编译器都会帮我们自动生成相应的 get,set方法,这很符合Java Bean的写法,但是有些是有我们只是想直接去调用,这个时候就可以这样去做。

Kotlin

data class TestKotlinBean(

@JvmField val message: String,

@JvmField val title: String)

**Java中调用 **

TestKotlinBean testKotlinBean = new TestKotlinBean("","");

String message = testKotlinBean.message;

String title = testKotlinBean.title;

当然对于 如下的示例,就算不用增加上面的注解,在java也都是可以直接调用,免除get,set。

lateinit var sum: String

object UserPicCache{

const val KEY_CACHE = "CACHE"

}

@get:JvmName,@set:JvmName

有些时候,我们只是想让其生成其中的一个set或者get方法,这个时候就可以使用上述注解。

Kotlin

data class TestKotlinBean(

@set:JvmName("setMessage")

var message: String,

@get:JvmName("getTitle")

val title: String

)

Java中调用:

TestKotlinBean testKotlinBean = new TestKotlinBean("", "");

testKotlinBean.setMessage("message");

testKotlinBean.getTitle();

七、Java调用Kt-伴生对象

@JvmStatic

当我们在Java中调用 Kotlin 伴生对象的方法或者变量时,必须通过 类名.Companion.xx 的方式才可以调用。这时候,我们就可以增加

@JvmStatic 来直接调用。

Kotlin

class Log {

companion object {

var time: String = ""

fun toLog() {

}

}

}

在Java中调用:

ToLog.toLog();

ToLog.getTime();

不过需要注意的是,@JvmStatic 对性能没有任何提升,因为相应的,编译器又生成了一个静态方法,对于可变变量,会生成两个静态方法set,get。

八、Java调用Kt-方法默认参PIDIFsZtKi数值

@JvmOverloads

在Kotlin中,对于方法参数,我们可能会加入一些默认值,便于更好的使用,但是在Java中,如果调用时不传递相应的方法参数,就会提示报错,这种使用就可以使用@JvmOverloads 修饰方法。

kotlin

object DialogUtils {

@JvmStatic

@JvmOverloads

fun showPromptDialog(title: String = "提示") {

}

}

在java中调用

DialogUtils.showPromptDialog();

DialogUtils.showPromptDialog("标题");


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python 人工智能之人脸识别 face_recognition 模块安装(python代码大全)
下一篇:python 图片转字符画(python能做什么)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~