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。

相关推荐
杉氧10 小时前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏10 小时前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧10 小时前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄11 小时前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android
落魄Android在线炒饭11 小时前
Android Framework 开发技巧:android.jar 生成与系统快速编译验证
android
如此风景12 小时前
Kotlin Flow操作符学习
android·kotlin
plainGeekDev12 小时前
GreenDAO → Room
android·java·kotlin
weiggle13 小时前
第八篇:ViewModel + Compose——生产级状态管理实践
android
恋猫de小郭18 小时前
Amper 正式转正 Kotlin Toolchain ,Gradle 未来何去何从
android·前端·flutter
plainGeekDev19 小时前
ButterKnife → ViewBinding
android·java·kotlin