实现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
相关产品推荐
相关产品推荐

