我已经创建了Java类的Kotlin子类:
class AlarmReceiver : WakefulBroadcastReceiver() {
companion object {
const val ACTION_NOTIFY = "..."
}
override fun onReceive(context: Context, intent: Intent) { ... }
}
WakefulBroadcastReceiver
有两种静态方法:
static boolean completeWakefulIntent(Intent intent)
static ComponentName startWakefulService(Context context, Intent intent)
并在我的AlarmReceiver
课程中调用这些内容就像我期望的那样。但是,我想在我的Kotlin子类之外调用其中一个方法。
如果我从另一个Kotlin类尝试AlarmReceiver.completeWakefulIntent(intent)
,我会收到以下编译错误:
未解决的参考:completeWakefulIntent
我认为这是因为编译器正在尝试解析AlarmReceiver
的伴随对象上的方法,而不是从其超类中查找继承的方法。作为一种解决方法,我可以在AlarmReceiver.Companion
上直接定义具有相同签名的方法:
class AlarmReceiver : WakefulBroadcastReceiver() {
companion object {
const val ACTION_NOTIFY = "..."
// Just call the superclass implementation for now
fun completeWakefulIntent(intent: Intent): Boolean =
WakefulBroadcastReceiver.completeWakefulIntent(intent)
}
...
}
我认为这与我依赖Java子类的默认继承方法时会有相同的行为,但我想知道是否有更好的方法来实现这一点。
有没有办法在Kotlin子类上调用继承的静态Java方法?
答案 0 :(得分:14)
在Kotlin中,与Java不同,静态成员不会被子类继承,即使它们可以在没有基类名的子类中调用。
在子类之外,您必须使用基类名称调用基类静态函数:
WakefulBroadcastReceiver.completeWakefulIntent(intent)
此行为似乎位于伴随对象概念中:层次结构中的类的伴随对象不会彼此包含在内。
有趣的是,对于接口,情况有点不同:interface static members cannot be referenced in subclasses without the interface name。此行为为the same to that in Java。