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。

相关推荐
叽哥2 小时前
Kotlin学习第 1 课:Kotlin 入门准备:搭建学习环境与认知基础
android·java·kotlin
风往哪边走2 小时前
创建自定义语音录制View
android·前端
用户2018792831672 小时前
事件分发之“官僚主义”?或“绕圈”的艺术
android
用户2018792831672 小时前
Android事件分发为何喜欢“兜圈子”?不做个“敞亮人”!
android
Kapaseker4 小时前
你一定会喜欢的 Compose 形变动画
android
QuZhengRong4 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
zhangphil5 小时前
Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin(2)
android·kotlin
程序员码歌12 小时前
【零代码AI编程实战】AI灯塔导航-总结篇
android·前端·后端
书弋江山13 小时前
flutter 跨平台编码库 protobuf 工具使用
android·flutter
来来走走15 小时前
Flutter开发 webview_flutter的基本使用
android·flutter