You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现DefaultLifecycleObserver时调用super.onCreate()触发Kotlin编译错误

Kotlin编译错误:调用super.onCreate()需指定父类型

问题代码

class XXXApplication : MultiDexApplication(), DefaultLifecycleObserver {
    override fun onResume(owner: LifecycleOwner) {
        super.onResume(owner)
    }

    override fun onPause(owner: LifecycleOwner) {
        super.onPause(owner)
    }

    companion object {
        lateinit var instance: XXXApplication private set
    }

    private lateinit var sharedPreferences: SharedPreferences

    override fun onCreate() {
        super.onCreate()

        instance = this

        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)

        initLifecycleObserver()
    }

    private fun initLifecycleObserver() {
        val lifecycle: Lifecycle = ProcessLifecycleOwner.get().lifecycle
        lifecycle.removeObserver(this)
        lifecycle.addObserver(this)
    }

    fun getSharedPreferences(): SharedPreferences {
        return sharedPreferences
    }
}

错误信息

Many supertypes available, please specify the one you mean in angle brackets, e.g., 'super<Foo>'

疑问

已知MultiDexApplication拥有无参的onCreate()方法,DefaultLifecycleObserver拥有带参数的onCreate(owner: LifecycleOwner)方法,显然此处调用的是MultiDexApplication的无参方法,为何编译器会抛出该错误?


原因解析

虽然两个onCreate方法参数列表不同,但Kotlin编译器在处理super调用时,会扫描所有父类型(包括继承的类和实现的接口)中同名方法,而非仅匹配参数的方法。

DefaultLifecycleObserver是Java 8风格的接口,其onCreate(owner: LifecycleOwner)是默认方法,属于接口的成员方法。当你的类同时继承MultiDexApplication并实现DefaultLifecycleObserver时,两者都存在名为onCreate的方法,编译器无法自动推断你要调用的目标父类型,因此要求显式指定。

解决方案

在调用super.onCreate()时,通过尖括号明确指定父类MultiDexApplication:

override fun onCreate() {
    super<MultiDexApplication>.onCreate()
    // 后续初始化代码...
}

这样编译器就能确定你要调用的是父类的无参onCreate方法,消除编译错误。


内容的提问来源于stack exchange,提问作者Cheok Yan Cheng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 22:00:10