假设我在旧/遗留Java库中有特定代码:
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 )没有正确的注释 .
当我在我的Kotlin代码中使用这个类并将所有构造函数参数设置为非null值时,一切都很好:
val foo = JavaClass("first string", "second string", "third string")
println("Value1: ${foo.notNullString.length}")
println("Value2: ${foo.nullableString?.length}")
println("Value3: ${foo.unannotatedString.length}")
第一个值是非null,所以我可以在没有安全调用的情况下访问它 . 第二个值我需要使用安全调用(nullableString?.length),如果没有,我有一个编译时错误,到目前为止一直很好 . 在第三个值(unannotatedString)我可以在没有安全调用的情况下使用它,它编译得很好 .
但是当我将第三个参数设置为“null”时,我没有得到编译时错误(不需要安全调用,只有运行时NullPointerException:
val bar = JavaClass("first string", "second string", null)
println("Value4: ${bar.unannotatedString.length}") // throws NPE
这是预期的行为吗? Kotlin的编译器是否将带注释的Java方法与使用@NotNull注释的方法相同?