Respostas:
Esta é T?uma conversão de tipo anulável inseguro ( ) para um tipo não anulável ( T),
!!será lançada NullPointerExceptionse o valor for null.
Está documentado aqui, juntamente com os meios de segurança nula da Kotlin.
sale.latestpode conter null; a atribuição será bem-sucedida somente se sale.latestnão for nula e lançará o NPE caso contrário. Isso fornece segurança nula para val price: seu tipo será não nulo. Veja kotlinlang.org/docs/reference/null-safety.html
!!você pode executar uma falha rápida e localizar a causa raiz de um NPE. Eu gostaria que o Java tivesse um recurso semelhante (ou seja, sem ifdeclarações e / ou assertíons feios ).
Aqui está um exemplo para tornar as coisas mais claras. Digamos que você tenha essa função
fun main(args: Array<String>) {
var email: String
email = null
println(email)
}
Isso produzirá o seguinte erro de compilação.
Null can not be a value of a non-null type String
Agora você pode impedir isso adicionando um ponto de interrogação ao Stringtipo para torná-lo anulável.
Então nós temos
fun main(args: Array<String>) {
var email: String?
email = null
println(email)
}
Isso produz um resultado de
null
Agora, se queremos que a função gere uma exceção quando o valor do email for nulo, podemos adicionar duas exclamações no final do email. Como isso
fun main(args: Array<String>) {
var email: String?
email = null
println(email!!)
}
Isso lançará um KotlinNullPointerException
O operador de golpe duplo é uma excelente opção para os fãs de NullPointerException(ou NPE, para abreviar).
O operador de asserção não nulo
!!converte qualquer valor em um tipo não nulo e lança uma exceção se o valor for nulo.
val nonNull = a!!.length
Portanto, você pode escrever a!!e isso retornará um valor não nulo de a(um Stringaqui por exemplo) ou lançará um NPE sea for nulo.
Se você deseja um NPE, pode obtê-lo, mas precisa solicitá-lo explicitamente. Esse operador deve ser usado nos casos em que o desenvolvedor está garantindo - o valor nunca será nulo .
!!está no final de uma declaração? A conversão automática de IJ para Kotlin fez isso por mimval price = sale.latest!!