作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有@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/
我遇到了@JvmSynthetic kotlin-stdlib 中的注释,我想知道它的用途,但不幸的是,它没有记录。 (UPD:就在那一刻) 据我了解,将其应用于程序元素会将 synthetic 修饰
在 Kotlin 中,当我有一个非公共(public)成员和一个调用它的 inline fun 时,会出现编译错误: Error:(22, 25) Kotlin: Public-API inline
我是一名优秀的程序员,十分优秀!