gpt4 book ai didi

java - 使用JvmSynthetic setter进行模棱两可的方法调用

转载 作者:行者123 更新时间:2023-12-02 13:27:00 26 4
gpt4 key购买 nike

我有一个带有@JvmSynthetic setter 的类,以便为Java客户端仅提供流畅的类似于构建器的 setter :

class PersonBuilder {
@set:JvmSynthetic // hide a void setter from Java
var age: Int? = null

@set:JvmSynthetic
var name: String? = null

fun setAge(age: Int?) = apply { this.age = age }

fun setName(name: String?) = apply { this.name = name }

fun build() = Person(age!!, name!!)
}
并在Java端这样称呼它:
new PersonBuilder()
.setAge(22) // <- "error"
.setName("Peter")
.build();
它确实可以编译并运行,但是Android Studio显示错误``歧义的方法调用.PersonBuilder中的setAge(Integer)和PersonBuilder中的setAge(Integer)都匹配'',并且在此“错误”之后不提供任何自动建议和代码格式。

最佳答案

我相信没有必要使用@set:JvmSynthetic表示法,只需更改变量的可见性即可。试试这个:

class PersonBuilder {
private var age: Int? = null
private var name: String? = null

fun setAge(age: Int) = apply { this.age = age }

fun setName(name: String) = apply { this.name = name }

fun build() = Person(age!!, name!!) //be careful!
}
无论如何,请注意构建功能。无法保证将在函数之前调用setAge和setName函数,因此可以获得NullPointerException
更新资料
通过保留 @JvmSynthetic解决此问题的另一种方法是也添加 @JvmField表示法。有关更多信息,请参见 this article

关于java - 使用JvmSynthetic setter进行模棱两可的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63283828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com