如何在Kotlin子类上访问Java静态方法?

How do I access a Java static method on a Kotlin subclass?

我创建了一个Java类的KOTLIN子类:

1
2
3
4
5
6
7
8
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上定义具有相同签名的方法:

1
2
3
4
5
6
7
8
9
10
11
12
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,静态成员不是由子类继承的,即使它们可以在没有基类名称的子类内调用。

在子类外部,必须使用基类名称调用基类静态函数:

1
WakefulBroadcastReceiver.completeWakefulIntent(intent)

这种行为似乎在伴生对象概念中:层次结构中类的伴生对象不包含在彼此中。

有趣的是,对于接口来说,情况有点不同:没有接口名称的子类中不能引用接口静态成员。此行为与Java中的相同。