Dim*_*ims 1 null intellij-idea kotlin
我用可空的参数写了我的课
class MyClass(a: String? = null) {
var b: String
init {
if( a == null ) {
b = "N/A"
}
else {
b = a
}
}
}
Run Code Online (Sandbox Code Playgroud)
并注意到,IntelliJ警告b = a
任务
Smart cast to kotlin.String
Run Code Online (Sandbox Code Playgroud)
为什么这个警告以及如何避免它?
这不是一个警告,只是编译器知道您的变量的信息a
是不 null
.因此,它可以用作String
代替可空的String?
,因此没有安全操作符,例如
否则,您需要显式a: String?
转换String
为使其可分配给String
变量b
,如以下屏幕截图所示:
这不是要避免的事情,这是一种称为智能转换的语言功能。
编译器已检测到它a
是给定代码路径上的非空值,因此您可以使用不可为空的String
类型来使用它,这样您就可以直接使用它,而不必担心其可为空性。如果您没有获得智能转换,则必须手动将其从 a转换String?
为 aString
才能调用其上的方法 - 或者将其分配给不可为 null 的变量,就像您的情况一样。
另一个可能更容易理解智能转换何时启动的示例是子类。假设您有Person
和Customer
类,只有后者有一个getPurchases()
方法。
在 Java 中,您必须执行以下操作才能调用所述方法:
if (p instanceof Customer) {
((Customer)p).getPurchases();
}
Run Code Online (Sandbox Code Playgroud)
在 Kotlin 中,您可以在块内智能转换if
为您已经检查过的子类型:
if (p is Customer) {
p.getPurchases()
}
Run Code Online (Sandbox Code Playgroud)
如果您考虑一下,从String?
到 的转换String
在工作中是相同的机制 - 您也得到了到更具体类型的智能转换。
if (a != null)
Run Code Online (Sandbox Code Playgroud)
给定a
的类型String?
基本相同
if (a is String)
Run Code Online (Sandbox Code Playgroud)