在 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;
DefaultAllocMethod
是 AllocMethod
的 java 子类
allocator
是Allocator
类型,它是一个具有上述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 allocMethod
和 fun 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?
,AllocMethod
是 Any
。这有助于理解为什么这些 getter 和 setter 不匹配。
【讨论】:
以上是关于在 Java 对象的 Kotlin 中设置属性时出现奇怪的“无法重新分配 Val”错误的主要内容,如果未能解决你的问题,请参考以下文章
当我最初在 java 或 Kotlin 中设置时,CheckBox 的 isChecked 不起作用
尝试在 Excel VBA 中设置 RefersToRange 属性时出现问题