我正在使用一种来自后端的动态表单系统。为了能够映射我的表单,我有一个带有泛型的访问者模式,我让它在 Java 中工作,但我无法让它在 Kotlin 中工作。
我有这个界面:
internal interface FormFieldAccessor<T> {
fun getFormField(formFieldDefinition: FormFieldDefinition): FormField<T>
fun setValueToBuilder(builder: Builder, value: T)
fun accept(visitor: FormFieldVisitor)
fun getValue(personalInfo: PersonalInfo): T
}
然后我有这样的访问器列表:
val accessors = mutableMapOf<String, FormFieldAccessor<*>>()
accessors[FIRST_NAME] = object : FormFieldAccessor<String> {
override fun getValue(personalInfo: PersonalInfo): String {
return personalInfo.surname
}
override fun accept(visitor: FormFieldVisitor) {
visitor.visitString(this)
}
override fun getFormField(formFieldDefinition: FormFieldDefinition): FormField<String> {
//not relevant
}
override fun setValueToBuilder(builder: Builder, value: String) {
builder.withSurname(value)
}
}
//more other accessors with different type like Int or Boolean
并想像这样使用它:
accessors[FIRST_NAME]!!.setValueToBuilder(builder, field.value )
但这不起作用并给我:
Out-projected type 'FormFieldAccessor<*>' prohibits the use of 'public abstract fun setValueToBuilder(builder: Builder, value: T): Unit defined in FormFieldAccessor'
如果你知道我做错了什么会很酷:)
编辑:这是我拥有的结构的一个小要点https://gist.github.com/jaumard/1fd1ccc9db0374cb5d08f047414a6bc8
我不想通过使用 Any 来丢失类型,与 Java 相比感到沮丧,因为它真的很容易实现。我现在了解星形投影的问题,但除此之外还有什么可以实现与 java 相同的吗?