What does <? super Void> mean?

JamMaster :

I have encountered this class in code that I'm maintaining:

new GenericFutureListener<Future<? super Void>>() {...}

I'm having a really hard time understanding what this means. A Future containing a type that is either Void or its superclass - Object. So why not just write Future<Object>?

Jorn Vernee :

It looks like this is being created to conform to some generic type like GenericFutureListener<Future<? super T>>, which is not flexible enough to allow for GenericFutureListener<Future<Void>> alone.

For instance if you have something like this:

class GenericFutureListener<T> {}

public static <T> void m(GenericFutureListener<Future<? super T>> p) {
    ...
}
m(new GenericFutureListener<Future<? super Void>>() {}); // works,
m(new GenericFutureListener<Future<Void>>() {}); // does not work

Passing in just a GenericFutureListener<Future<Void>> is not allowed.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=35373&siteId=1