Kotlin 在编译时使用“可空?”的分离进行了出色的空检查。和“不可为空”的对象。它有一个 KAnnotator 来帮助确定来自 Java 的对象是否为 nullabale。但是,如果不可为空的类的某些部分被更改了怎么办?
假设我们有一只猫,它当然有一个可以喵喵叫的头。当我们让猫喵喵叫时,它会用头喵喵叫:
package org.cat
class CatHead(){
fun mew(){
println("Mew")
}
}
class Cat(){
var head = CatHead()
fun mew(){
head.mew()
}
}
fun main(args:Array<String>){
val cat = Cat()
cat.mew()
}
现在让我们在这张漂亮的图片中添加一个 JAVA 猫疯子 (CatManiac.java),他在得到时会砍掉一只猫的头:
import org.cat.*;
public class CatManiac {
public static void cutCatHead(Cat cat){
cat.setHead(null);
}
}
所以如果我们把一只猫传给一个疯子,他肯定会砍掉它的头。猫怎么会说没有头的喵?
fun main(args:Array<String>){
val cat = Cat()
CatManiac.cutCatHead(cat)
cat.mew()
}
在调用 cat.mew()时,由于 null,我们在 kotlin 中得到了一个运行时错误:
Exception in thread "main" java.lang.IllegalArgumentException".
我相信这是我们在 Kotlin 中使用 Java 库时会遇到的一个非常常见的问题。有什么方法或计划来警告/与之抗争吗?
PS 像 KAnnotator 这样的东西在你的代码中寻找这样的东西吗?