Considere este ejemplo:
import java.math.BigDecimal fun main(args: Array<String>) { val s: String? = null BigDecimal(s) } compila sin ninguna advertencia (con cli kotlinc e IntelliJ) y lanza en tiempo de ejecución:
Exception in thread "main" java.lang.NullPointerException at java.math.BigDecimal.<init>(BigDecimal.java:809) ...Traté de construirlo de diferentes maneras de acuerdo con documentos como este:
kotlinc \ -Xnullability-annotations=@javax.annotation:strict \ -Xnullability-annotations=@org.jetbrains.annotations:strict \ -Xjsr305=strict \ Main.kt -d main.jarLa anotación parece estar allí (como se ve en IntelliJ):
Docs establece claramente que:
Los tipos de Java que tienen anotaciones de nulabilidad no se representan como tipos de plataforma, sino como tipos de Kotlin reales que aceptan nulos o que no son nulos.
¿Que me estoy perdiendo aqui?
El argumento del constructor BigDecimal se trata como un tipo de plataforma porque el constructor en realidad no está anotado.
El IDE calcula sobre la marcha la anotación @NotNull examinando el código fuente. Si hace ctrl+clic en el constructor, irá al código fuente donde verá que no hay anotaciones.