Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 重写超类的抽象属性会导致类型错误_Android_Kotlin - Fatal编程技术网

Android 重写超类的抽象属性会导致类型错误

Android 重写超类的抽象属性会导致类型错误,android,kotlin,Android,Kotlin,我已经为这个问题挣扎了几个小时,但没有找到解决办法。 我正在使用MVP模式和数据绑定构建一个android应用程序,我想减少使用特定的呈现者创建具有特定绑定的片段的样板代码 因此,我声明了以下抽象类: abstract class AbstractBoundFragment : Fragment(), Screen { protected abstract var presenter: Presenter<Screen> protected abstract var

我已经为这个问题挣扎了几个小时,但没有找到解决办法。 我正在使用MVP模式和数据绑定构建一个android应用程序,我想减少使用特定的呈现者创建具有特定绑定的片段的样板代码

因此,我声明了以下抽象类:

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
}