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

我创建了一个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方法?

在Kotlin中,与Java不同,静态成员不会被子类继承,即使它们可以在没有基类名称的子类中调用。

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

 WakefulBroadcastReceiver.completeWakefulIntent(intent) 

这种行为似乎存在于伴随对象概念中:层次结构中类的伴随对象不包括在彼此之中。

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