Android---Kotlin 学习013

互操作性和可空性

Java 世界里所有对象都可能是 null,而 kotlin 里面不能随便给一个变量赋空值的。所有,kotlin 取调用 java 的代码就很容易出现返回一个 null,而 Kotlin 的接收对象不能为空,你不能想当然地认为 java 的返回值就能符合 kotlin 关于空值的规定。

此时,因为不知道返回的是否是 null,所以可以使用空安全操作符。如果为空,则不执行后面的函数。

类型映射

代码运行时,所有的映射类型都会重新映射回对应的 Java 类型。

示例:

在 java 里声明一个 int 类型变量

java 复制代码
public int score;

在 kotlin 里面调用这个属性,查看其类型

Kotlin 复制代码
// 类型映射
println(StudentInfo.score.javaClass)

属性访问

kotlin 访问 java 的属性时,不需要调用相关 get() 方法。给 java 属性赋值时,也可以使用赋值语法来设置一个 Java 字段值。

@JvmName

可以使用 @JvmName 注解指定编译类的名字

示例:在 java 中调用 kotlin 的函数。

可以看到,java 里使用 kotlin 文件里的函数时,会在函数名后加Kt(xxxKt)形成接收者。如果我们想要原来的名,而不加 Kt,那么就可以使用 @JvmName 来指定类名。

@JvmField

在 Java 里,不能直接访问 kotlin 的属性,例如 spells 属性,必须调用 getSpells() 方法。然而,你可以给 Kotlin 属性添加 @JvmField 注解,暴露它的支持字段给 Java 调用者,从而避免使用 get() 方法。与 kotlin 里直接访问 java 属性一样。

@JvmOverloads

@JvmOverloads 注解协助产生 Kotlin 函数的重载版本。设计一个可能会暴露给 Java 用户使用的 API 时,记得使用 @JvmOverloads 注解。这样,无论你是 Kotlin 开发者还是 Java 开发者,都会对这个 API 的可靠性感到满意。

如果在 java 里调用 deskmate() 只传一个参数,肯定会报错

为了实现和 kotlin 里一样的效果,只传一个参数,另一个参数使用默认值,那么就可以使用 @JvmOverloads 注解进行强制重载。

@JvmStatic

@JvmField 注解还能用来以静态方式提供伴生对象里定义的值。

@JvmStatic 注解的作用类似于 @JvmField,允许你直接调用伴生对象里的函数

@Throws

抛出一个需要检查的指定异常,Java 和 Kotlin 有关异常检查的差异让 @Throw 注解给解决掉了,在编写供 Java 开发者调用的 Kotlin API 时,要考虑使用 @Throws 注解,这样,用户就知道怎么正确处理任何异常了。

Kotlin 复制代码
@Throws(IOException::class)
fun acceptApology(){
    throw IOException()
}

示例:kotlin 里抛出异常,在 java 里处理

函数类型操作

函数类型和匿名函数能提供高效的语法用于组件间的交互,是 Kotlin 编程语言里比较新颖的特性。它们简洁的语法因->操作符实现,但 Java8 之前 JDK 版本并不支持 lambda 表达式。在 Java 里,Kotlin 函数类型使用 FunctionN 这样的名字的接口来表示,FunctionN 中的 N 代表值参数目。这样的 Function 接口有 23 个,从 Function0 到 Function22,每一个 FunctionN 都包含一个 invoke 函数,专用于调用函数类型函数,所以,任何时候需要调一个函数类型,都用它调用 invoke。

相关推荐
zhaoyufei1338 小时前
Android13删除Taskbar
android
G_dou_9 小时前
KMP & OpenHarmony 实现二分查找
kotlin·鸿蒙
6***B489 小时前
存储过程(SQL)
android·数据库·sql
学困昇11 小时前
C++中的异常
android·java·c++
Jerry11 小时前
问题记录 - Android IdleHandler 没有执行
android
没有了遇见11 小时前
Android ButterKnife Android 35情况下 适配 Gradle 8.+
android
方白羽12 小时前
Android多层嵌套RecyclerView滚动
android·java·kotlin
菜就多学13 小时前
SurfaceControlViewHost 实现跨进程UI渲染
android·设计
2501_9151063213 小时前
iOS App 测试工具全景分析,构建从开发调试到线上监控的多阶段工具链体系
android·测试工具·ios·小程序·uni-app·iphone·webview
小羊在奋斗14 小时前
MySQL表的约束:从基础到核心(附场景+案例)
android·数据库·mysql