I have the following class hierarchy by now:
interface Interface<T> {
boolean isGreaterThan(T other);
}
class Base implements Interface<Base> {
public boolean isGreaterThan(Base other) {
return true;
}
}
class Subclass extends Base {
... //note that I dont need to implement or overwrite isGreaterThan() here
}
class Wrapper<E extends Interface<E>> {
protected List<E> list;
...
}
class Test {
public static void main(String[] args) {
Wrapper<Subclass> = new Wrapper<Subclass>(); //This line produces the error
}
}
I get the following error message:
Type parameter 'Subclass' is not within its bound; should implement 'Interface<Subclass>'
My Question is: How can I tell java, that the Interface should accept any element E which extends T? Or is the reason in Wrapper? I tried for the Wrapper:
class Wrapper<E extends Interface<? extends E>> {}
which rather produced errors in the body of wrapper, and did not change the original error.
Wrapper<Base> wrapper = new Wrapper<Base>();
works just fine... how can I make
Wrapper<Subclass> wrapper = new Wrapper<Subclass>();
work as well? Is there a clean way without any casts? (Wildcards allowed)
Thanks!
try
class Wrapper<E extends Interface<? super E>>
just like Comparable
, it is intuitively a 'contra-variant' type, therefore in most cases it should be used with <? super>
. For example Collections.sort