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

Ron*_*tin 13 kotlin

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

class AlarmReceiver : WakefulBroadcastReceiver() {

    companion object {
        const val ACTION_NOTIFY = "..."
    }

    override fun onReceive(context: Context, intent: Intent) { ... }
}
Run Code Online (Sandbox Code Playgroud)

WakefulBroadcastReceiver 有两种静态方法:

  • static boolean completeWakefulIntent(Intent intent)
  • static ComponentName startWakefulService(Context context, Intent intent)

从我的AlarmReceiver班级中调用这些就像我期望的那样.但是,我想在我的Kotlin子类之外调用其中一种方法.

问题

如果我尝试AlarmReceiver.completeWakefulIntent(intent)使用不同的Kotlin类,我会收到以下编译错误:

未解决的参考: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)
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

我认为这与我依赖Java子类的默认继承方法时会有相同的行为,但我想知道是否有更好的方法来做到这一点.

有没有办法在Kotlin子类上调用继承的静态Java方法?

hot*_*key 14

在Kotlin中,与Java不同,静态成员不是由子类继承的,即使它们可以在没有基类名的子类内调用.

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

WakefulBroadcastReceiver.completeWakefulIntent(intent)
Run Code Online (Sandbox Code Playgroud)

此行为似乎位于伴随对象概念中:层次结构中的类的伴随对象不会彼此包含在内.

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