在 Java 对象的 Kotlin 中设置属性时出现奇怪的“无法重新分配 Val”错误

Posted

技术标签:

【中文标题】在 Java 对象的 Kotlin 中设置属性时出现奇怪的“无法重新分配 Val”错误【英文标题】:Strange "Val cannot be reassigned" error when setting a property in Kotlin of a Java object 【发布时间】:2016-11-19 18:34:22 【问题描述】:

奇怪的是,我的 Kotlin 代码之前编译得很好,当它在 java 类 Allocator 中看起来像这样时:

public void setAllocMethod(@NotNull AllocMethod allocMethod) 
    this.allocMethod = allocMethod;

但是当我把 java 类的 setter 改成这个时:

public void setAllocMethod(@Nullable AllocMethod allocMethod) 
    this.allocMethod= allocMethod;

然后当我编译项目时,我在调用 java 对象的 kt 文件中得到这个 Kotlin 错误:

Val 无法重新分配

allocator.allocMethod = DefaultAllocMethod() // kotlin code

这里还有 java getter:

public @NotNull AllocMethod getAllocMethod() 
        if (allocMethod == null) allocMethod = DefaultAllocMethod.newDefault();
        return allocMethod;

DefaultAllocMethodAllocMethod 的 java 子类

allocatorAllocator 类型,它是一个具有上述getter 和setter 的java 类。

谁能解释发生了什么?谢谢

【问题讨论】:

您能否在问题中扩展一下 java getter 方法的外观? ok,完成...你认为问题在于getter返回@NotNull但setter的参数是@Nullable 【参考方案1】:

您的 setter 类型 @Nullable AllocMethod(即 Kotlin 的 AllocMethod?)与 getter 类型 @NotNull AllocMethod(即 Kotlin 的 AllocMethod)不匹配

错误消息的意思是,由于类型不匹配,因此只有 getter 被视为属性。所以从 Kotlin 的角度来看,而不是 var allocMethod 你有 val allocMethodfun setAllocMethod(...)

【讨论】:

是的,这就是我希望 java 类的行为方式。如果 setter 传递了一个 null,那么将使用 DefaultAllocMethod(从 getter 返回)。哦,好吧,我想这对 java 来说很好,但与 Kotlin 不兼容。我仍然不太明白错误消息,这与 *val 被重新分配. Maybe in this day and age my method of programming is rather stupid (using this type of lazy initialization), I think I'll just create a DefaultAllocMethod` 以初始化 allocMethod 属性有什么关系,这样一切都可以是`@NotNull`` 那可能会更好。无论如何,请看我的编辑【参考方案2】:

请记住,AllocMethod?Any?AllocMethodAny。这有助于理解为什么这些 getter 和 setter 不匹配。

【讨论】:

以上是关于在 Java 对象的 Kotlin 中设置属性时出现奇怪的“无法重新分配 Val”错误的主要内容,如果未能解决你的问题,请参考以下文章

当我最初在 java 或 Kotlin 中设置时,CheckBox 的 isChecked 不起作用

尝试在 Excel VBA 中设置 RefersToRange 属性时出现问题

使用 Java 语言在 MySQL 中设置 SQL 用户定义函数时出现问题

在 EditText Kotlin 中设置文本

如何在 prisma.yml 中设置“集群”属性

尝试从 Kotlin 中的另一个活动访问 EditText 时出现空指针异常