Как получить доступ к статическому методу Java в подклассе Kotlin?

Я создал подкласс Kotlin класса Java:

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 .

Проблема

Если я попробую AlarmReceiver.completeWakefulIntent(intent) из другого класса Kotlin, я получаю следующую ошибку компиляции:

Неразрешенная ссылка: fullWakefulIntent

Я думаю, это связано с тем, что компилятор пытается разрешить метод на сопутствующем объекте 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, но мне интересно, есть ли лучший способ сделать это.

Есть ли способ вызвать унаследованный статический метод Java в подклассе Kotlin?

В Kotlin, в отличие от Java, статические члены не наследуются подклассами, хотя они могут быть вызваны внутри подкласса без имени базового класса.

Вне подкласса вы должны вызвать статические функции базового класса, используя имя базового класса:

 WakefulBroadcastReceiver.completeWakefulIntent(intent) 

Такое поведение, по-видимому, лежит в концепции сопутствующих объектов: сопутствующие объекты классов в иерархии не включены друг в друга.

Интересно, что для интерфейсов ситуация немного другая: в статических элементах интерфейса нельзя ссылаться в подклассах без имени интерфейса . Это то же самое, что и в Java .