Enum<E extends Enum<E>> basically means: "each enum must be an enum of its own type".
It more or less forces Enum subtypes to return instances of their own type, which makes sense.
I say more or less, because if Enum wasn't a special class in the
Java language, it would be possible to make a declaration like this:
. This however would still force Color to be an Enum<Color>, which is what it's all about.
If in Java you want subtypes of a type to return or accept instances of their own formal type, the general
pattern is: X<T extends X<T>>.