我创建了一个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),我会得到以下编译错误:
Unresolved reference: 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方法?
在Kotlin中,不同于Java,静态成员不是由子类继承的,即使它们可以在没有基类名称的子类内调用。
在子类外部,必须使用基类名称调用基类静态函数:
WakefulBroadcastReceiver.completeWakefulIntent(intent)
这种行为似乎在伴生对象概念中:层次结构中类的伴生对象不包含在彼此中。
有趣的是,对于接口来说,情况有点不同:没有接口名称的子类中不能引用接口静态成员。此行为与Java中的相同。
啊,那就解释了。您是否知道在哪里记录了静态成员不是继承的?
不,我在医生那里没有提到过。最正式的解释似乎是@yole给出的。
谢谢!我也没在医生身上看到任何东西,可能自己也找不到。