我已经为这个问题苦苦挣扎了几个小时,但没有解决方案。 我正在使用 MVP 模式和 DataBinding 构建一个 android 应用程序,我想减少使用特定 Presenter 创建具有特定绑定(bind)的 fragment 的样板代码。
因此我声明了以下抽象类:
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
}
当我在具体 fragment 中扩展此类时,我得到以下类型的错误:
"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数据绑定(bind)生成的类,明明是extended ViewDataBinding
.
对于被覆盖的演示者,我得到了同样的错误。 ArtistsPresenter extends
abstract Presenter<Screen>
正确分类。
class ArtistListFragment : AbstractBoundFragment(),
ArtistListScreen {
@Inject
override lateinit var presenter: ArtistsPresenter // type error here
override lateinit var binding: FragmentArtistListBinding // and type error here
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentArtistListBinding {
return FragmentArtistListBinding.inflate(inflater, container, false)
}
override fun showArtist(artistName: String) {
// do stuff
}
}
我在这里错过了什么?
最佳答案
与 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
的实例执行此操作。
关于android - 覆盖父类(super class)的抽象属性导致类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50249702/