Kotlin 我可以为没有相应getter的Java setter使用属性语法吗?

Kotlin 我可以为没有相应getter的Java setter使用属性语法吗?,kotlin,kotlin-java-interop,kotlin1.4,Kotlin,Kotlin Java Interop,Kotlin1.4,我有一个带有setter的Java类,但没有属性的getter class Person { private String name; public void setName(String name) { this.name = name; } } 我想使用.name=从Kotlin分配给它 fun example() { val p = Person() p.name = "example" } 我在编译Kotlin时遇到一个错误未解析的引用:name。

我有一个带有setter的Java类,但没有属性的getter

class Person {
  private String name;
  public void setName(String name) { this.name = name; }
}
我想使用
.name=
从Kotlin分配给它

fun example() {
  val p = Person()
  p.name = "example"
}
我在编译Kotlin时遇到一个错误
未解析的引用:name
。如果我添加一个getter,错误就会消失,但是我可以将setter用作属性而不在Java中定义getter吗?我知道我仍然可以从kotlin调用
p.setName(“示例”)

以上是MCVE。真实世界的代码是一个Java构建器,带有setter,但没有getter,我想从Kotlin使用它,比如

val widget = WidgetBuilder().apply {
  width = 1  // instead I need .setWidth(1)
  height = 2
  weight = 3
  name = "my widget"
}.build()

不,Kotlin编译器仅在存在与setter具有相同或更高可见性的getter时才将其识别为属性。这是因为Kotlin中不存在没有getter的属性。()

请注意,如果Java类只有一个setter,那么它在Kotlin中不作为属性可见,因为Kotlin不支持仅设置属性

您可以手动为该类编写扩展属性,使属性访问语法对您可用,尽管有些人可能认为它是反模式来对属性具有非功能的吸气剂。但是,您可以控制扩展属性的可见性,因此这可能没问题

var WidgetBuilder.width: Int
    @Deprecated("Getter is unsupported.", level = DeprecationLevel.ERROR)
    get() = error("unsupported")
    set(value) { setWidth(value) }
构建器的另一种选择是创建一个扩展函数,其中包含所有可能设置的参数以及默认值。然后,您可以使用
apply
获得与示例类似的语法


FWIW,我只是在使用Java构建器时按预期使用链式方法调用。

您能将getter标记为已弃用,以发出更强烈的警告不要使用它吗?@gidds好主意,我补充道。然后尝试使用它将发出编译器警告。