Soy relativamente nuevo en el concepto de los genéricos en Java y no puedo decir la diferencia entre los 2 respuestas.
La pregunta en cuestión es la siguiente:
Supongamos que tenemos una clase genérica E y queremos que el parámetro de tipo a E
que sea una subclase de E
. En otras palabras, permitimos E<F>
sólo si la clase F
es o bien E
o hereda de E
.
He reducido las opciones a lo que es posible.
1. class E<T extends E>
2. class E<T extends E<T>>.
Creo que la opción 1 se ajusten a las especificaciones de la cuestión. Sin embargo Estoy confundido acerca de la opción 2, lo que es lo que realmente se extienden.
Bueno, en realidad la opción 1 utiliza un tipo de prima.
Definiría E
a tener un parámetro T
, por lo que E
es un tipo parametrizado. Si se define T
para extender E
, también debe especificar el parámetro de tipo de E
, o de lo contrario E
es un tipo crudo.
Así que la única "válida" 1 opción es la opción 2:
class E<T extends E<T>>
La Enum
clase es un ejemplo bien conocido de un parámetro de tipo recursivo. Ver Java Enum definición .
1 Técnicamente, la primera opción también es válida en el sentido de sintácticamente correcta. Pero los tipos primas están allí sólo para compabibility hacia atrás. Nuevo código debe no contener tipos primas. Véase también ¿Qué es un tipo de prima y por qué no deberíamos usarlo? .