Próbuję napisać aplikację Vaadin w Kotlin. W przypadku wiązania danych Vaadin 8 zapewnia teraz możliwość bezpiecznego wiązania danych typu. W Kotlin Liczyłam praca tak:Wnioskowanie o typ nie powiodło się: za mało informacji, aby odczytać parametr Proszę podać go jawnie
class LoginModel {
var username: String = ""
var password: String = ""
}
class LoginView : FormLayout() {
val name = TextField("name")
val password = TextField("password")
val loginButton = Button("login")
init {
val binder = Binder<LoginModel>()
binder.forField(name).bind(
{ it.username },
{ bean, value -> bean.username = value })
//...
}
}
Dostaję następujący komunikat o błędzie tutaj:
Error:(23, 31) Kotlin: Type inference failed: Not enough information to infer parameter BEAN in fun <BEAN : Any!, TARGET : Any!, BEAN : Any!> Binder.BindingBuilder<BEAN#1 (type parameter of bind), TARGET>.bind(p0: ((BEAN#1!) -> TARGET!)!, p1: ((BEAN#1!, TARGET!) -> Unit)!): Binder.Binding<BEAN#1!, TARGET!>!
Please specify it explicitly.
próbowałem przez wyraźnych określając parametry Typ:
binder.forField(name).bind<LoginView, String, LoginView>(
{ it.username },
{ bean, value -> bean.username = value })
ale to prowadzi do komunikatu o błędzie (i innych błędów sytax, więc nie zastosowałem tego podejścia)
Error:(23, 35) Kotlin: No type arguments expected for fun bind(p0: ValueProvider<LoginModel!, String!>!, p1: Setter<LoginModel!, String!>!): Binder.Binding<LoginModel!, String!>! defined in com.vaadin.data.Binder.BindingBuilder
Moje drugie podejście próbuje bezpośrednio przekazać udostępniające właściwości Kotlin, ale komunikat o błędzie był taki sam jak pierwszy:
binder.forField(name).bind(LoginModel::username.getter, LoginModel::username.setter)
Ostatni approeach próbował użyć metodę rozszerzenia i zrobić wszystko jak wyraźny, jak to możliwe:
fun <BEAN, TARGET> Binder.BindingBuilder<BEAN, TARGET>.bind(property: KMutableProperty1<BEAN, TARGET>) {
fun set(bean: BEAN): TARGET = property.get(bean)
fun get(bean: BEAN, value: TARGET): Unit = property.set(bean, value)
this.bind(::set, ::get)
}
Ale to nadal prowadzi do tego samego komunikatu o błędzie jako pierwsza
Nie miałem również problemów z Kotlinem 1.1.2-5. – petey