我一直在努力解决这个问题几个小时并且不喜欢任何解决方案。 我正在使用MVP模式和DataBinding构建一个Android应用程序,我希望使用特定的Presenter减少使用特定绑定创建片段的样板代码。
因此我声明了以下抽象类:
abstract class AbstractBoundFragment : Fragment(), Screen {
protected abstract var presenter: Presenter<Screen>
protected abstract var binding: ViewDataBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = getBinding(inflater, container)
return binding.root
}
override fun onAttach(context: Context) {
super.onAttach(context)
presenter.attachScreen(this)
}
override fun onDetach() {
presenter.detachScreen()
super.onDetach()
}
protected abstract fun getBinding(inflater: LayoutInflater, container: ViewGroup?): ViewDataBinding
}
当我在具体片段中扩展此类时,我得到以下类型错误:
"Var-property type is 'FragmentArtistListBinding', which is not a type of overridden protected abstract var binding: ViewDataBinding defined in xy.z.ui.utils.AbstractBoundFragment."
FragmentArtistListBinding
是由android数据绑定生成的类,它明确地扩展了ViewDataBinding
。
我为被覆盖的演示者得到了同样的错误。 <{1}}正确ArtistsPresenter extends
课程。
abstract Presenter<Screen>
我在这里缺少什么?
答案 0 :(得分:1)
与val
相反,var
是协变的,abstract class Base {
abstract var x: Any
}
class Derived : Base {
override var x: String
}
fun main() {
val base: Base = Derived()
base.x = 1
}
类型是不变的。想想以下情况:
Base.x
Any
是Int
,那么为什么不为1
分配Derived
值document.querySelectorAll
?但显然这是错误的,因为您正在对document.querySelectorAll('#id_1, #id_2, #id_3').forEach( s =>
s.addEventListener( "focus", function(e){
console.log( "focussed " + e.currentTarget );
}) //end addEventListener
); //end forEach
的实例执行此操作。