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 E
estende 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 Enum
non 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> {}
Second
implementerebbe Comparable<First>
piuttosto che Comparable<Second>
... ma First
andrebbe bene.