Answers:
这是不安全的可为null的类型(T?)到非可为null的类型()的转换T,
 如果值为!!则会抛出NullPointerException该异常null。
在此与Kotlin的null-safety方法一起记录在案。
sale.latest可以包含null; 仅当sale.latest不为null时,分配将成功,否则将抛出NPE。这提供了null安全性val price:其类型将为非null。参见kotlinlang.org/docs/reference/null-safety.html
                    !!您可以快速失败并找到NPE的根本原因。我希望Java具有类似的功能(即没有丑陋的if声明和/或assert离子)。
                    这是使情况更清楚的示例。说你有这个功能
fun main(args: Array<String>) {
    var email: String
    email = null
    println(email)
}这将产生以下编译错误。
Null can not be a value of a non-null type String现在,您可以通过在String类型中添加问号使其可为空来防止这种情况。
所以我们有
fun main(args: Array<String>) {
    var email: String?
    email = null
    println(email)
}这产生了一个结果
null
现在,如果我们希望函数在email值为null时引发异常,则可以在email末尾添加两个感叹号。像这样
fun main(args: Array<String>) {
    var email: String?
    email = null
    println(email!!)
}这会抛出一个 KotlinNullPointerException
对于NullPointerException(或简称NPE)的粉丝,Double-bang运算符是一个绝佳选择。
该不是空断言运营商
!!转换为任意值非空类型,如果值为null抛出异常。
val nonNull = a!!.length因此,您可以编写a!!,这将返回非null值a(String例如a),如果a为null,则抛出NPE 。
如果需要NPE,可以拥有它,但是必须明确要求它。在开发人员保证的情况下应使用此运算符-该值永远不会为null。
!!语句结束时是什么意思?IJ自动转换为Kotlin为我做到了val price = sale.latest!!