Significa che l'argomento tipo per enum deve derivare da un enum che a sua volta ha lo stesso argomento tipo. Come può succedere? Rendendo l'argomento type il nuovo tipo stesso. Quindi, se ho un enum chiamato StatusCode, sarebbe equivalente a:
public class StatusCode extends Enum<StatusCode>
Ora, se controlli i vincoli, abbiamo Enum<StatusCode>- così E=StatusCode. Controlliamo: si Eestende Enum<StatusCode>? Sì! Stiamo bene
Potresti chiederti qual è il punto di questo :) Bene, significa che l'API per Enum può fare riferimento a se stessa - ad esempio, essere in grado di dire che Enum<E>implementa Comparable<E>. La classe base è in grado di fare i confronti (nel caso di enumerazioni) ma può assicurarsi che confronta solo il giusto tipo di enumerazioni tra loro. (EDIT: Beh, quasi - vedi la modifica in fondo.)
Ho usato qualcosa di simile nella mia porta C # di ProtocolBuffers. Ci sono "messaggi" (immutabili) e "costruttori" (mutabili, usati per costruire un messaggio) - e vengono come coppie di tipi. Le interfacce coinvolte sono:
public interface IBuilder<TMessage, TBuilder>
where TMessage : IMessage<TMessage, TBuilder>
where TBuilder : IBuilder<TMessage, TBuilder>
public interface IMessage<TMessage, TBuilder>
where TMessage : IMessage<TMessage, TBuilder>
where TBuilder : IBuilder<TMessage, TBuilder>
Ciò significa che da un messaggio è possibile ottenere un builder appropriato (ad es. Per prendere una copia di un messaggio e modificare alcuni bit) e da un builder è possibile ottenere un messaggio appropriato al termine della costruzione. È comunque un buon lavoro, gli utenti dell'API non devono preoccuparsene davvero - è terribilmente complicato e ha impiegato diverse iterazioni per arrivare dove si trova.
EDIT: Nota che questo non ti impedisce di creare tipi dispari che usano un argomento di tipo che va bene, ma che non è lo stesso tipo. Lo scopo è quello di dare benefici nel caso giusto piuttosto che proteggerti dal caso sbagliato .
Quindi se Enumnon sono stati gestiti "specialmente" in Java, è possibile (come indicato nei commenti) creare i seguenti tipi:
public class First extends Enum<First> {}
public class Second extends Enum<First> {}
Secondimplementerebbe Comparable<First>piuttosto che Comparable<Second>... ma Firstandrebbe bene.