kotlin 和 Java的互操作

kotlin调用java代码

kotlin中关键字在java中进行转义

如果一个 Java 库使用了 Kotlin 关键字作为方法,你仍然可以通过反引号(`)字符转义它来调用该方法。

foo.is(bar)

空安全 和 平台类型

java 中的任何引用都可能是 null,这使得 Kotlin 对来自 Java 的对象要求严格空安全是不现实的。 Java 声明的类型在 Kotlin 中会被特别对待并称为平台类型。对这种类型的空检查会放宽, 因此它们的安全保证与在 Java 中相同。

val list = ArrayList() // 非空(构造函数结果) list.add("Item") val size = list.size() // 非空(原生 int) val item = list[0] // 推断为平台类型(普通 Java 对象) item.substring(1) // 允许,如果 item == null 可能会抛出异常

当我们调用平台类型变量的方法时,Kotlin 不会在编译时报告可空性错误, 但在运行时调用可能会失败,因为空指针异常或者 Kotlin 生成的阻止空值传播的断言。

空安全是怎么做到的?

val nullable: String? = item // 允许,没有问题 val notNull: String = item // 允许,运行时可能失败

如果我们选择非空类型,编译器会在赋值时触发一个断言。这防止 Kotlin 的非空变量保存空值。当我们把平台值传递给期待非空值等的 Kotlin 函数时,也会触发断言。 总的来说,编译器尽力阻止空值通过程序向远传播。

getClass()

val fooClass = foo::class.java val fooClass = foo.javaClass

clone()

要覆盖 clone(),需要继承 kotlin.Cloneable:

class Example : Cloneable { override fun clone(): Any { …… } }

finalize()

要覆盖 finalize(),所有你需要做的就是简单地声明它,而不需要 override 关键字:

class C { protected fun finalize() { // 终止化逻辑 } }

Kotlin中使用JNI

要声明一个在本地(C 或 C++)代码中实现的函数,你需要使用 external 修饰符来标记它:

external fun foo(x: Int): Double

java中调用kotlin

results matching ""

    No results matching ""