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

时间:2016-08-26 17:10:26

标签: kotlin

我已经创建了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方法?

1 个答案:

答案 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