Search code examples
javagenericswildcardsupercomparable

Java wildcards with super


I read that using a wildcard with super like this:

public class MyClass <T extends Comparable<? super T>> {
   ...
}

instead of:

public class MyClass <T extends Comparable<T>> {
   ...
}

could make the class 'more generic', but I do not understand why.

Can someone provide some concrete examples?


Solution

  • This way you can supply a class for T, which does not for itself implements Comparable, but inherits from a class implementing Comparable.

    E.g.

    class Baseclass implements Comparable<Baseclass> {
    ...
    }
    
    class Inherited extends Baseclass {
    ...
    }
    

    With a specification like

    public class MyClass <T extends Comparable<? super T>> {
    ...
    }
    

    you can use MyClass<Inherited>, and MyClass<Baseclass>, but with

    public class MyClass <T extends Comparable<T>> {
    ...
    }
    

    you can only use MyClass<Baseclass>