Rogue
Rogue

Reputation: 11483

Return a type based on inner bounding

I have a method for retrieving the relevant "Plugin" that registered a listener service:

private static final Map<Class<? extends SubListener>, ListenerPluginPair<?>> listeners = new HashMap<>();

//Retrieves registering plugin
public static <T extends SubListener<?>> Plugin getRegisteringPlugin(Class<T> listener) {
    return ListenerManager.getPair(listener).getPlugin();
}

private static <T extends SubListener<?>> ListenerPluginPair<?> getPair(Class<T> listener) {
    Validate.isTrue(ListenerManager.isRegistered(listener), "Class is not registered with listener manager!");
    return ListenerManager.listeners.get(listener);
}

However, I'm wondering if there's a way to return based on the inner bounding of the SubListener, for instance in pseudocode:

public static <T extends SubListener<E extends Plugin>> E getRegisteringPlugin(Class<T> plugin) {
    return ListenerManager.getPair(listener).<E>getPlugin();
}

I can't actually specify a new generic type bounding inside of the SubListener<?>, so is this possible to implement through helper classes or some other magic in Java?

Upvotes: 1

Views: 53

Answers (1)

Rogue
Rogue

Reputation: 11483

Figured it out!

Simply make a bound that you'll use later in your inner bound:

public static <T extends Plugin> T getRegisteringPlugin(Class<? extends SubListener<T>> listener) {//...

Upvotes: 1

Related Questions