Significa que el argumento de tipo para enum debe derivarse de una enumeración que tiene el mismo argumento de tipo. ¿Cómo puede pasar esto? Al hacer que el argumento de tipo sea el nuevo tipo en sí. Entonces, si tengo una enumeración llamada StatusCode, sería equivalente a:
public class StatusCode extends Enum<StatusCode>
Ahora, si verifica las restricciones, tenemos Enum<StatusCode>
, entonces E=StatusCode
. Vamos a ver: ¿se E
extiende Enum<StatusCode>
? ¡Si! Estamos bien
Puede que se pregunte cuál es el punto de esto :) Bueno, significa que la API de Enum puede referirse a sí misma, por ejemplo, poder decir que se Enum<E>
implementa Comparable<E>
. La clase base puede hacer las comparaciones (en el caso de las enumeraciones) pero puede asegurarse de que solo compara el tipo correcto de enumeraciones entre sí. (EDITAR: Bueno, casi, vea la edición en la parte inferior).
He usado algo similar en mi puerto C # de ProtocolBuffers. Hay "mensajes" (inmutables) y "constructores" (mutables, utilizados para construir un mensaje), y vienen en pares de tipos. Las interfaces involucradas son:
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>
Esto significa que de un mensaje puede obtener un generador apropiado (por ejemplo, para tomar una copia de un mensaje y cambiar algunos bits) y de un generador puede obtener un mensaje apropiado cuando haya terminado de construirlo. Sin embargo, es un buen trabajo que los usuarios de la API no necesitan preocuparse realmente por esto: es terriblemente complicado y tomó varias iteraciones para llegar a donde está.
EDITAR: tenga en cuenta que esto no le impide crear tipos extraños que utilizan un argumento de tipo que sí está bien, pero que no es del mismo tipo. El propósito es brindar beneficios en el caso correcto en lugar de protegerlo del caso incorrecto .
Entonces, si de Enum
todos modos no se manejó "especialmente" en Java, podría (como se señala en los comentarios) crear los siguientes tipos:
public class First extends Enum<First> {}
public class Second extends Enum<First> {}
Second
implementaría en Comparable<First>
lugar de Comparable<Second>
... pero en First
sí estaría bien.