Disons que j'ai code particulier dans le vieux/héritage bibliothèque Java:sécurité nulle dans les bibliothèques Java existantes utilisées dans Kotlin pojects
public class JavaClass {
private String notNullString;
private String nullableString;
private String unannotatedString;
public JavaClass(@NotNull String notNullString,
@Nullable String nullableString,
String unannotatedString) {
this.notNullString = notNullString;
this.nullableString = nullableString;
this.unannotatedString = unannotatedString;
}
@NotNull
public String getNotNullString() {
return notNullString;
}
@Nullable
public String getNullableString() {
return nullableString;
}
public String getUnannotatedString() {
return unannotatedString;
}
}
Les deux premiers paramètres sont correctement annotés avec @NotNull et annotations @Nullable (en utilisant JetBrains .annotations). Le troisième (unnanotatedString) est laissé sans annotation appropriée.
Lorsque j'utilise cette classe dans mon code Kotlin et mis tous les arguments du constructeur à des valeurs non nulles, tout va bien:
val foo = JavaClass("first string", "second string", "third string")
println("Value1: ${foo.notNullString.length}")
println("Value2: ${foo.nullableString?.length}")
println("Value3: ${foo.unannotatedString.length}")
La première valeur est non nulle pour que je puisse y accéder sans appel sécurisé. Deuxième valeur et je dois utiliser safe call (nullableString? .length), sinon, j'ai une erreur de compilation, jusqu'ici tout va bien. Sur la troisième valeur (unannotatedString) je peux l'utiliser sans un appel sûr, il compile bien.
Mais quand je mets le troisième paramètre à « null » Je ne suis pas une erreur de compilation (pas d'appel en toute sécurité nécessaire, seulement la durée d'exécution NullPointerException:
val bar = JavaClass("first string", "second string", null)
println("Value4: ${bar.unannotatedString.length}") // throws NPE
Est-ce que le comportement attendu est le compilateur de Kotlin? ? pas de traitement annotée méthodes Java mêmes que ceux annotés avec @NotNull