Kotlin | 与Java互调的那些事

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

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

@NotNull

Java

class TestJava {
    public void toNotNull(@NotNull String title) {}
    public void toNull(String title){}
}

Kotlin中调用

网络异常,图片无法展示
|

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

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

Java

public Object object;
//使用kotlin中关键字命名的方法
public void is() {
}

Kotlin中调用

 testJava.`is`()
 testJava.`object`

Kt调用Java-SAM转换

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

示例如下

Java

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

在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(“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"
 }

@set:JvmName

@get: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-方法默认参数值

@JvmOverloads

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

kotlin

object DialogUtils {
    @JvmStatic
    @JvmOverloads
    fun showPromptDialog(title: String = "提示") {
    }
}

在java中调用

DialogUtils.showPromptDialog();
DialogUtils.showPromptDialog("标题");
目录
相关文章
|
1月前
|
Java 调度 Android开发
Android经典实战之Kotlin的delay函数和Java中的Thread.sleep有什么不同?
本文介绍了 Kotlin 中的 `delay` 函数与 Java 中 `Thread.sleep` 方法的区别。两者均可暂停代码执行,但 `delay` 适用于协程,非阻塞且高效;`Thread.sleep` 则阻塞当前线程。理解这些差异有助于提高程序效率与可读性。
46 1
|
3月前
|
安全 Java 编译器
Android面试题之Java 泛型和Kotlin泛型
**Java泛型是JDK5引入的特性,用于编译时类型检查和安全。泛型擦除会在运行时移除类型参数,用Object或边界类型替换。这导致几个限制:不能直接创建泛型实例,不能使用instanceof,泛型数组与协变冲突,以及在静态上下文中的限制。通配符如<?>用于增强灵活性,<? extends T>只读,<? super T>只写。面试题涉及泛型原理和擦除机制。
34 3
Android面试题之Java 泛型和Kotlin泛型
|
3月前
|
安全 Java 编译器
Kotlin和Java 单例模式
Kotlin和Java 单例模式
43 1
|
3月前
|
安全 Java Android开发
Kotlin与Java:Android开发的双剑合璧
【6月更文挑战第9天】Kotlin和Java在Android开发中形成互补态势。Java凭借广泛社区支持和丰富的类库资源占据主导,但其语法繁琐和空指针问题限制了发展。Kotlin,设计来解决这些问题,以其简洁、安全、高效的特性逐渐兴起。Kotlin的互操作性允许与Java无缝集成,提升开发效率,减少错误。两者结合提高了代码质量和开发者的灵活性,促进了Android开发社区的繁荣。开发者应把握这种&quot;双剑合璧&quot;,适应技术发展。
53 10
|
3月前
|
Java Android开发 Kotlin
Android面试题:App性能优化之Java和Kotlin常见的数据结构
Java数据结构摘要:ArrayList基于数组,适合查找和修改;LinkedList适合插入删除;HashMap1.8后用数组+链表/红黑树,初始化时预估容量可避免扩容。SparseArray优化查找,ArrayMap减少冲突。 Kotlin优化摘要:Kotlin的List用`listOf/mutableListOf`,Map用`mapOf/mutableMapOf`,支持操作符重载和扩展函数。序列提供懒加载,解构用于遍历Map,扩展函数默认参数增强灵活性。
42 0
|
4月前
|
Java Kotlin
java调用kotlin代码编译报错“找不到符号”的问题
java调用kotlin代码编译报错“找不到符号”的问题
224 10
|
3月前
|
自然语言处理 Java Android开发
Java一分钟之Kotlin与Java互操作
【6月更文挑战第12天】本文探讨了Kotlin与Java之间的互操作性,重点关注了两者在调用对方代码时的常见问题和解决策略。在Kotlin调用Java时,需注意Java的`package-private`访问限制、泛型擦除和重载解析差异。建议使用`public`修饰符、明确泛型类型并了解重载规则。在Java调用Kotlin时,需处理Kotlin特性的不可见性、命名冲突和顶层函数调用。可以通过遵循Java习惯、使用`@JvmName`注解和封装顶层函数为类方法来避免问题。通过掌握这些技巧,开发者能更好地在多语言环境下工作。
40 0
|
4月前
|
JavaScript 前端开发 Java
Java和Javascript互调的例子
Java和Javascript互调的例子
35 3
|
4月前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能对比
【5月更文挑战第4天】在移动开发的世界中,性能一直是衡量应用质量的重要指标。随着Kotlin的兴起,许多Android开发者开始考虑是否应该从传统的Java迁移到Kotlin。本文通过深入分析两者在Android平台上的性能差异,帮助开发者理解Kotlin在实际项目中的表现,并提供选择编程语言时的参考依据。
70 5
|
4月前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【5月更文挑战第29天】 在移动开发领域,性能优化一直是开发者追求的关键目标。随着Kotlin在Android开发中的普及,了解其与传统Java语言在性能方面的差异成为一项重要议题。本文通过深入分析和对比两种语言的运行效率、启动时间以及内存消耗,为开发者在选择编程语言时提供数据支持和实践指南,从而帮助他们构建更加高效的Android应用。