【问题标题】:How do I access a Java static method on a Kotlin subclass?如何访问 Kotlin 子类上的 Java 静态方法?
【发布时间】:2017-01-03 10:21:40
【问题描述】:

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


    【解决方案1】:

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

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

    WakefulBroadcastReceiver.completeWakefulIntent(intent)
    

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

    有趣的是,对于接口,情况有点不同:interface static members cannot be referenced in subclasses without the interface name。这种行为是the same to that in Java

    【讨论】:

    • 啊,这就解释了。您是否碰巧知道静态成员不被继承的记录在哪里?
    • 不,我在文档中没有提到它。最官方的解释好像是@yole给出的this one
    • 谢谢!我也没有在文档中看到任何内容,可能我自己也找不到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2016-02-27
    • 1970-01-01
    相关资源
    最近更新 更多