In generic type declaration the wildcard ‘?’ and the ‘super’ keyword are NOT allowed; following will NOT compile:
public <? super T> void go(List<T> a) {  }

However, this is perfectly valid:
public static <T extends Comparable<? super T>> void sort(List<T> list)

The type has to implement comparable of itself or its superclass. So consider java.util.Date. It implements Comparable<Date>. But what about java.sql.Date? It implements Comparable<java.util.Date> as well (java.sql.Date extends java.util.Date).
Without the super signature, SortedList would not be able accept the type of java.sql.Date, because it doesn’t implement a Comparable of itself, but rather of a super class of itself.

Extends – tells you what you can get out of a class (you get at least this, perhaps a subclass). e.g.,
public static <T> void copy(List<T> dest, List<? extends T> src)

Super – tells you what you can put into the class (at most this, perhaps a superclass).



Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s