android - 覆盖父类(super class)的抽象属性导致类型错误

标签 android kotlin

我已经为这个问题苦苦挣扎了几个小时,但没有解决方案。 我正在使用 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.xAny,那么为什么不给它分配 Int1 ?但显然这是错误的,因为您正在对 Derived 的实例执行此操作。

关于android - 覆盖父类(super class)的抽象属性导致类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50249702/

相关文章:

java - 是否可以在 Android 项目中运行最新版本的 Akka 框架(2.5.2)?

android - 构建 Android APK 时出现 DuplicateFileException 错误

android - ListView 底部的 TextView - api 7

android - Android Studio Chipmunk 中缺少数据库检查器选择

java - 在 java6 kotlin 项目和 java8 kotlin 项目之间共享 kotlin 源文件

java - hexString.toInt(32) NumberFormatException

android - 在 Kotlin 协程中等待 LiveData 结果

android - android源码中CTS的使用

java - Android BLE为多个BLE设备设置多个通知

添加 Firebase Analytics 后 Android 应用崩溃