Android 重写超类的抽象属性会导致类型错误
我已经为这个问题挣扎了几个小时,但没有找到解决办法。 我正在使用MVP模式和数据绑定构建一个android应用程序,我想减少使用特定的呈现者创建具有特定绑定的片段的样板代码 因此,我声明了以下抽象类:Android 重写超类的抽象属性会导致类型错误,android,kotlin,Android,Kotlin,我已经为这个问题挣扎了几个小时,但没有找到解决办法。 我正在使用MVP模式和数据绑定构建一个android应用程序,我想减少使用特定的呈现者创建具有特定绑定的片段的样板代码 因此,我声明了以下抽象类: abstract class AbstractBoundFragment : Fragment(), Screen { protected abstract var presenter: Presenter<Screen> protected abstract var
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
}
FragmentArtistListBinding
是由android数据绑定生成的类,它显然扩展了ViewDataBinding
。
对于被覆盖的演示者,我得到了相同的错误ArtistsPresenter正确扩展了抽象演示者
类
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
?但很明显,这是错误的,因为您正在对派生的
实例执行此操作
abstract class Base {
abstract var x: Any
}
class Derived : Base {
override var x: String
}
fun main() {
val base: Base = Derived()
base.x = 1
}