Kotlin中的Wicket NumberTextField在提交时抛出ClassCastException

Kotlin中的Wicket NumberTextField在提交时抛出ClassCastException,wicket,kotlin,Wicket,Kotlin,我对Kotlin(1.1.0)中的Wicket(8.0.0-M4)NumberTextField有一些问题 我的精简表单如下所示: class Test : AbstractWebPage() { val housenumberModel: Model<Int> = Model<Int>() val housenumber = NumberTextField<Int>("housenumberModel", housenumberModel)

我对Kotlin(1.1.0)中的Wicket(8.0.0-M4)NumberTextField有一些问题

我的精简表单如下所示:

class Test : AbstractWebPage() {

    val housenumberModel: Model<Int> = Model<Int>()
    val housenumber = NumberTextField<Int>("housenumberModel", housenumberModel)

    val form: Form<Unit> = object : Form<Unit>("adressForm") {}

    override fun onInitialize() {
        super.onInitialize()

        form.add(housenumber.setRequired(false))
        form.add(object : SubmitLink("submit") {
            override fun onSubmit() {
                super.onSubmit()
                println(housenumberModel.`object`)  // this is line 28
            }

        })
        add(form)
    }

}
new NumberTextField<Integer>("housenumberModel", housenumberModel, Integer.class);
类测试:AbstractWebPage(){
val housenumberModel:Model=Model()
val housenumber=NumberTextField(“housenumberModel”,housenumberModel)
val form:form=object:form(“AddressForm”){}
覆盖乐趣初始化(){
super.onInitialize()
表格.add(房屋编号.setRequired(false))
添加(对象:SubmitLink(“提交”){
override-fun-onSubmit(){
super.onSubmit()
println(housenumberModel.`object`)//这是第28行
}
})
添加(表格)
}
}
提交表单后,我得到以下stacktrace:

java.lang.ClassCastException:无法将java.lang.String转换为 java.lang.Number 在com.mycompany.test.pages.test$onInitialize$1.onSubmit(test.kt:28) 位于org.apache.wicket.markup.html.form.form.delegateSubmit(form.java:1312) 位于org.apache.wicket.markup.html.form.form.process(form.java:979) 位于org.apache.wicket.markup.html.form.form.onFormSubmitted(form.java:802) 位于org.apache.wicket.markup.html.form.form.onRequest(form.java:715) 位于org.apache.wicket.core.request.handler.ListenerRequestHandler.internalInvoke(ListenerRequestHandler.java:301) 位于org.apache.wicket.core.request.handler.ListenerRequestHandler.invoke(ListenerRequestHandler.java:250) 位于org.apache.wicket.core.request.handler.ListenerRequestHandler.invokeListener(ListenerRequestHandler.java:210) 位于org.apache.wicket.core.request.handler.ListenerRequestHandler.respond(ListenerRequestHandler.java:203) 位于org.apache.wicket.request.cycle.RequestCycle$handleExecutor.respond(RequestCycle.java:912) 位于org.apache.wicket.request.RequestHandlerExecutor.execute(RequestHandlerExecutor.java:65) 位于org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:283) 位于org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:253) 位于org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:221) 位于org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:262) 位于org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:204) http.WicketFilter.doFilter(WicketFilter.java:286) [……]

如果我使用

val housenumberModel: Model<Int> = Model.of(0)
val house numbermodel:Model=Model.of(0)
而不是

val housenumberModel: Model<Int> = Model<Int>()
val housenumberModel:Model=Model()
一切正常。但是由于我的NumberTextField是可选的,我不想用0预先初始化它

我和我的同事们试图以我们能想象到的任何方式更改模型的类型签名,但没有找到解决方案。一位同事建议编写一个自定义Wicket转换器,因为Kotlins Int被表示为一个基元类型(来自文档:“在JVM上,这种类型的不可为null的值被表示为基元类型Int的值”)。尽管我还不知道这是否可行,但这对我来说似乎有些过分

我可以想到的另一个技巧是:编写一些JavaScript来删除输入字段中的零。也不是我真正想做的事情

问题:我的问题有简单的解决办法吗

(还有一个额外的问题:是否有人已经在Kotlin中编写了一个更大的Wicket应用程序,并且可以告诉我这个组合是否已经准备好在黄金时间使用这个堆栈开发一个关键项目,或者我的问题只是冰山一角?)

[编辑]

svenmeier指出的解决方案:

使用

val housenumber = NumberTextField<Int>("housenumberModel", housenumberModel, Int::class.java) 
val housenumber=NumberTextField(“housenumberModel”,housenumberModel,Int::class.java)
工作

或者作为替代方案:

val housenumbervalue: Int?  = null
val housenumberModel: IModel<Int> = PropertyModel<Int>(this, "housenumbervalue")
val housenumber = NumberTextField<Int>("housenumberModel", housenumberModel)
val housenumbervalue:Int?=无效的
val housenumberModel:IModel=PropertyModel(这是“housenumbervalue”)
val housenumber=NumberTextField(“housenumberModel”,housenumberModel)

由于类型擦除,您的NumberExtField无法检测模型的通用类型参数。由于模型对象为null,因此也不能将其用于派生类型

在本例中,Wicket假定字符串模型对象类型:/


要么显式地向NumberTextField提供类型,要么使用保留其泛型信息的模型,例如PropertyModel。

有一种方法可以告诉wicket您想要的类型,就是在构造函数中添加类型。更多

在Java中,它如下所示:

class Test : AbstractWebPage() {

    val housenumberModel: Model<Int> = Model<Int>()
    val housenumber = NumberTextField<Int>("housenumberModel", housenumberModel)

    val form: Form<Unit> = object : Form<Unit>("adressForm") {}

    override fun onInitialize() {
        super.onInitialize()

        form.add(housenumber.setRequired(false))
        form.add(object : SubmitLink("submit") {
            override fun onSubmit() {
                super.onSubmit()
                println(housenumberModel.`object`)  // this is line 28
            }

        })
        add(form)
    }

}
new NumberTextField<Integer>("housenumberModel", housenumberModel, Integer.class);
newnumbertextfield(“housenumberModel”,housenumberModel,Integer.class);