18

I've created a Kotlin subclass of a Java class:

class AlarmReceiver : WakefulBroadcastReceiver() { companion object { const val ACTION_NOTIFY = "..." } override fun onReceive(context: Context, intent: Intent) { ... } } 

WakefulBroadcastReceiver has two static methods:

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

and calling these from within my AlarmReceiver class works just as I expect. However, I'd like to call one of these methods outside of my Kotlin subclass.

The Problem

If I try AlarmReceiver.completeWakefulIntent(intent) from a different Kotlin class, I get the following compilation error:

Unresolved reference: completeWakefulIntent

I think this is because the compiler is trying to resolve the method on AlarmReceiver's companion object instead of finding the inherited method from its superclass. As a workaround, I can directly define a method with the same signature on 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) } ... } 

I think this has the same behavior I would have gotten had I relied on the default inherited method from a Java subclass, but I'm wondering if there's a better way to do this.

Is there a way to call an inherited static Java method on a Kotlin subclass?

1 Answer 1

19

In Kotlin, unlike Java, static members are not inherited by subclasses, even though they can be called inside a subclass without the base class name.

Outside a subclass, you have to call the base class static functions using the base class name:

WakefulBroadcastReceiver.completeWakefulIntent(intent) 

This behavior seems to lie within the companion objects concept: companion objects of classes in a hierarchy are not included into each other.

Interestingly, for interfaces the situation is a bit different: interface static members cannot be referenced in subclasses without the interface name. This behavior is the same to that in Java.

Sign up to request clarification or add additional context in comments.

3 Comments

Ah, that would explain it. Do you happen to know where it's documented that static members are not inherited?
Nope, I haven't come across any mention of it in the docs. The most official explanation seems to be this one given by @yole.
Thanks! I also didn't see anything in the docs and probably wouldn't have found this on my own.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.