【发布时间】:2019-11-20 06:32:50
【问题描述】:
我有以下 Java 类:
public class JavaClass {
private String nullableJavaField;
@Nullable public String getNullableJavaField() {
return nullableJavaField;
}
public void setNullableJavaField(@NotNull String nullableJavaField) {
this.nullableJavaField = nullableJavaField;
}
}
其意图是 nullableJavaField 最初可能为 null,但任何后续的 set 操作都只能使用非 null 值。当从另一个 Java 类调用时,它会按预期工作:
JavaClass jv = new JavaClass();
jv.setNullableJavaField(null); // Produces warning about passing null parameter
但是,等效的 Kotlin 代码会产生错误“无法重新分配 Val”:
val jv = JavaClass()
jv.nullableJavaField = "Foo" // Produces error "Val cannot be reassigned"
据我所知,nullableJavaField 不是最终的,那么为什么 Kotlin 抱怨分配给一个 val?我搜索了this和this等类似问题,但找不到答案。
【问题讨论】:
-
@user7294900 不,这不能解决问题,因为我没有重新分配 jv,我正在重新分配 jv.nullableJavaField
-
“等效的 Kotlin 代码”是什么意思?您是从 Kotlin 代码中调用 Java 类还是在 Kotlin 中重写了该类?
@NotNull属于哪个库? -
如果字段应该是 NotNull,为什么要返回 Nullable 值?您的代码的用户应该知道他们不应该在初始化之前访问 null 字段。因此,我会将 getNullableJavaField() 方法标记为
@NotNull,或者如果您想确保它们不会获得空值,则可以在构造 POJO 时强制用户填写这些字段。 -
@Neo 我用 Kotlin 重写了课程
-
@NatigBabayev 当然,这就是我在现实世界中会做的事情。我只是在阅读 Kotlin 文档,就想到了这个问题。