【问题标题】:Using Java fields with @NotNull setters and @Nullable getters in Kotlin在 Kotlin 中使用带有 @NotNull setter 和 @Nullable getter 的 Java 字段
【发布时间】: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?我搜索了thisthis等类似问题,但找不到答案。

【问题讨论】:

  • @user7294900 不,这不能解决问题,因为我没有重新分配 jv,我正在重新分配 jv.nullableJavaField
  • “等效的 Kotlin 代码”是什么意思?您是从 Kotlin 代码中调用 Java 类还是在 Kotlin 中重写了该类? @NotNull 属于哪个库?
  • 如果字段应该是 NotNull,为什么要返回 Nullable 值?您的代码的用户应该知道他们不应该在初始化之前访问 null 字段。因此,我会将 getNullableJavaField() 方法标记为@NotNull,或者如果您想确保它们不会获得空值,则可以在构造 POJO 时强制用户填写这些字段。
  • @Neo 我用 Kotlin 重写了课程
  • @NatigBabayev 当然,这就是我在现实世界中会做的事情。我只是在阅读 Kotlin 文档,就想到了这个问题。

标签: java kotlin nullable


【解决方案1】:

对于 Kotlin,这不是可变属性。 setNullableJavaField 期望 String,而 getNullableJavaField 返回 String?nullableJavaField 因此也是如此。所以你必须直接使用setter。

val jv = JavaClass()
jv.setNullableJavaField("Foo")

【讨论】:

  • 所以它不是可变的,因为 setter 和 getter 使用不同的类型?
  • 是的。如果是String,你可能会得到一个带有getter 的空指针,如果是String?,它可能会得到一个带有setter 的空指针。如果可空性是相反的,则属性将是 String
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
相关资源
最近更新 更多