覆盖超类的抽象属性会导致类型错误

时间:2018-05-09 09:16:54

标签: android kotlin

我一直在努力解决这个问题几个小时并且不喜欢任何解决方案。 我正在使用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>

我在这里缺少什么?

1 个答案:

答案 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

AnyInt,那么为什么不为1分配Deriveddocument.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 的实例执行此操作。