我有一个带有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时,我得到一个错误< code > unresolved reference:name 。如果我添加了一个getter,错误就消失了,但是我能在Java中不定义getter的情况下使用setter作为属性吗?我知道我仍然可以从kotlin调用< code > p . set name(" example ")。
以上是 MCVE。现实世界的代码是一个Java构建器,其中包含setter,但不是我想从Kotlin中使用的getter,例如
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 不支持仅 set 属性。
您可以手动为此类编写扩展属性,以使属性访问语法可供您使用,尽管有些人可能会认为为属性设置非函数式 getter 是一种反模式。但是,您可以控制扩展属性的可见性,因此可能没问题。
var WidgetBuilder.width: Int
@Deprecated("Getter is unsupported.", level = DeprecationLevel.ERROR)
get() = error("unsupported")
set(value) { setWidth(value) }
对于构建者来说,另一种选择是创建一个扩展函数,其中包含您可以在其上设置的所有参数以及默认值。然后,您可以使用命名参数获得与< code>apply示例有些类似的语法。
FWIW,我只是在使用Java构建器时按预期使用链接的方法调用。
嗨,我试图使用strut得到一个bean到我的jsp代码,我在我的jsp页面中使用的bean是:但是每当我运行jsp时,我就会收到 bean的“unitForm”的属性“testData.team.type”没有getter方法。 我正在尝试将棒球写入我的JSP页面。 我的行动表单的代码是: 测试数据类具有: 最后在我的体育课上:
我正在尝试用Struts填充select。但是,我得到了一条错误消息:name在其所查找的类中也没有名为“label”的变量,因此我不知道它是如何查找 表单类是一个非常典型的实体类 关于为什么会出现这个错误,有什么建议吗?
我在jsp文件中有这个,它可以工作: 但是我想显示一个html:选择像这样: 但不起作用,错误显示: 没有可用于属性认证的getter方法。名为org的bean的estado。阿帕奇。struts。塔格里布。html。豆 谢谢
Struts(1.38)新手,我得到以下错误:没有getter方法可用于名称hsForm下的bean的属性hs.has关系ToTeam。我被告知在HSDivForm中创建getHs和setHs方法,但这是问题所在吗?或者我该怎么做? 我的豆子: 我的表格: 我的jsp:
对于bean中未定义实际属性的属性,使用getter方法是一种好的做法。例如,假设我有一个bean类,如下所示:websitebean: 让我们说,如果我正在使用这个类的strut工作如下:我ndex.jsp: 所以我的问题是:在jsp文件中使用这样的url是一种很好的做法,而我们在它后面没有任何属性绑定。我们是否看到了这方面的任何问题,或者像这样使用很好? 编辑:将返回类型更改为getUrl()
如何使用自定义setter声明属性,但在Kotlin中没有getter?例如,在安科,他们这样做: 但在我看来,这有点骇人。这样做对吗?如果是,那么当一个项目没有Anko依赖关系时,情况会怎样呢? 附言:让我说清楚——我想没有吸气剂,而不是私人吸气剂