var notNull: String = "hello"
var nullable: String? = null
默认不可空,可空需要加上问号
访问可空属性
var nullable: String? = null
println(nullable?.length)
需要加上 ? 才能访问,否则编译报错。这里打印输出 null
强转为不可空类型
println(nullable!!.length)//如果nullable为空,则运行抛异常
强转类型为空时运行抛异常 :::danger 不推荐此方式! :::
Elivs ?:
var nullable: String? = null
println(nullable?.length)
// println(nullable!!.length)
println(nullable?.length ?: 0) //Elivs
nullable?.length ?: 0 ,当nullable 为空时,输出0。
空类型继承关系
var x: String = "hello"
var y: String? = "world"
x = y // 编译报错
y = x // ok
里氏替换原则:父类可以接收子类,但子类不能接受父类。
证明:String? 父类 , String 子类
平台类型不知道可空非空
- kotlin 可以编译成其他平台执行代码
假设有一个Java类,Personal.java。需要在kotlin中调用
public class Personal {
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
val personal = Personal()
val title1 = personal.title //类型String! 是平台类型(Java)
println(title1.length)//空异常
- kotlin 无法判断平台类型是否可空类型
- val title1 类型是String! 无法在kotlin直接声明的,可以用ctrl+shift+P 查看类型
那有没有办法解决?不能彻底解决,可以在Java 类使用注解约束。
public class Personal {
private String title;
@NotNull
public String getTitle() {
return title == null ? "" : title;
}
public void setTitle(String title) {
this.title = title;
}
}
又比如 Java 中一些方法,IDE无法判断可空
val file = File("abc")
val listFiles = file.listFiles() //这是Java方法 java.io.File
println(listFiles.size) //运行抛空指针,ide只有警告
:::danger 在 kotlin 使用 Java API 还是要注意空指针问题! :::