Nous devons commencer par le type de Nothing
. Ce type a exactement zéro valeur possible. C'est un type de fond et est un sous-type de chaque autre type (à ne pas confondre avec Any
qui est un supertype de tout autre type ). Nothing
peut être contraint à n'importe quel type, de sorte que vous pouvez faire des choses comme :
fun doStuff(a: Int): String =
TODO("this typechecks")
Passons maintenant au type de Nothing?
c'est-à-dire Nothing
ou null
. Il a 0 + 1 valeurs possibles. Donc null
a un type de Nothing?
. Nothing?
peut être converti en n'importe quel type nullable, de sorte que vous pouvez faire des choses comme :
var name: String? = null
Ici null : Nothing?
est contraint de String?
.
Pour une raison quelconque, malheureusement, il y a cette fonction définie dans stdlib :
operator fun String?.plus(other: Any?): String
qui permet null + null
en s'appuyant sur les règles de coercition que j'ai mentionnées plus haut.