比方說,我在老/遺留Java庫特定代碼:空安全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;
}
}
前兩個參數都正確地@NotNull和@Nullable註解(使用JetBrains公司.annotations)。第三個(unnanotatedString)沒有適當的註釋。
當我在科特林代碼中使用這個類,所有構造函數的參數設置爲非空值,一切都很好:
val foo = JavaClass("first string", "second string", "third string")
println("Value1: ${foo.notNullString.length}")
println("Value2: ${foo.nullableString?.length}")
println("Value3: ${foo.unannotatedString.length}")
第一個值不爲空,所以我可以不用訪問安全通話。第二個值,我需要使用安全調用(nullableString?.length),如果沒有,我有一個編譯時錯誤,到目前爲止這麼好。在第三個值(unannotatedString)我可以使用它沒有一個安全的調用,它編譯好。
但是,當我設置的第三個參數爲「空」我沒有得到一個編譯時錯誤(無需安全通話,僅在運行NullPointerException異常:
val bar = JavaClass("first string", "second string", null)
println("Value4: ${bar.unannotatedString.length}") // throws NPE
那是預期的行爲是科特林的編譯器? ?治療不帶註釋的Java方法相同,與@NotNull註釋的那些