AFAIK, my class extends
parent classes and implements
interfaces. But I run across a situation, where I can't use implements SomeInterface
. It is the declaration of a generic types. For example:
public interface CallsForGrow {...}
public class GrowingArrayList <T implements CallsForGrow> // BAD, won't work!
extends ArrayList<T>
Here using implements
is syntactically forbidden. I thought first, that using interface inside <> is forbidden at all, but no. It is possible, I only have to use extends
instead of implements
. As a result, I am "extending" an interface. This another example works:
public interface CallsForGrow {...}
public class GrowingArrayList <T extends CallsForGrow> // this works!
extends ArrayList<T>
To me it seems as a syntactical inconsistancy. But maybe I don't understand some finesses of Java 6? Are there other places where I should extend interfaces? Should the interface, that I mean to extend, have some special features?
Best Answer
In the case of generic type variables the compiler doesn't actually care if
T
is a class, an interface, an enum or an annotation. All it cares about is that it is a type with a given set of sub- and super-types.And there is no reason to complicate the syntax just because in one other place (where you actually implement an interface) the distinction between classes and interfaces is relevant (for example if you
implement
an interface, you need to implement all methods it defines, but you don't need to, if youextend
a (non-abstract) class).Assuming for a moment that you'd have to write
implements
here, then you'd also need a separate syntax forenum
values (instead of simply writing<E extends Enum<E>>
) and annotations (which you can easily declare using<A extends Annotation>
).The only place where you need to write
implements
is at the point where you actually implement the interface. At that point (and that point only) the difference is important, because you must implement the methods defined in the interface. For everyone else, it doesn't matter if any givenA
is a base class or an implemented interface ofB
: it's a super-type and that's all that matters.Also note that there's one other place where you use
extends
with interfaces:At this point
implements
would be wrong, becauseB
does not implementA
.