这篇文章主要讲解了“Java与Kotlin互调怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java与Kotlin互调怎么实现”吧!
class TestJava { public void toNotNull(@NotNull String title) {} public void toNull(String title){} }
kotlin
中调用java方法,参数时,如果含有Kotlin关键字,必须增加 反引号 ``
public Object object; //使用kotlin中关键字命名的方法 public void is() { }
testJava.`is`() testJava.`object`
在Kotlin中调用带有接口参数的方法时,如果这个接口只有一个方法,那么就可以通过 lambda 表达式实现 SAM转换,从而简化我们的代码。
示例如下:
public class TestJavaSam { void singleFun(@NotNull IListener iListener) {} void noParameter( @NotNull IListener iListener,int sum) {} void noParameterClean(int sum,@NotNull IListener iListener) {} } interface IListener { void onClick(); }
fun main() { val sam = TestJavaSam() sam.singleFun { } sam.noParameter({ //如果更改一下java方法参数的顺序,那么就会更简洁,如下 },123) sam.noParameterClean(123){ } }
在Kotlin
中,有些方法并不想暴露给Java调用,这时就可以增加这个注解在方法上。
@JvmSynthetic fun toMain() { }
此时toMain() 在Java中将无法调用到。
在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中,我们去调用Kotlin 的 成员变量 时,编译器都会帮我们自动生成相应的 get,set方法,这很符合Java Bean的写法,但是有些是有我们只是想直接去调用,这个时候就可以这样去做。
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" }
有些时候,我们只是想让其生成其中的一个set或者get方法,这个时候就可以使用上述注解。
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中调用 Kotlin 伴生对象的方法或者变量时,必须通过 类名.Companion.xx 的方式才可以调用。这时候,我们就可以增加
@JvmStatic 来直接调用。
class Log { companion object { var time: String = "" fun toLog() { } } }
在Java中调用:
ToLog.toLog(); ToLog.getTime();
不过需要注意的是,@JvmStatic
对性能没有任何提升,因为相应的,编译器又生成了一个静态方法,对于可变变量,会生成两个静态方法set,get。
在Kotlin中,对于方法参数,我们可能会加入一些默认值,便于更好的使用,但是在Java中,如果调用时不传递相应的方法参数,就会提示报错,这种使用就可以使用@JvmOverloads
修饰方法。
object DialogUtils { @JvmStatic @JvmOverloads fun showPromptDialog(title: String = "提示") { } }
DialogUtils.showPromptDialog(); DialogUtils.showPromptDialog("标题");
感谢各位的阅读,以上就是“Java与Kotlin互调怎么实现”的内容了,经过本文的学习后,相信大家对Java与Kotlin互调怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。