Sí, estaba pensando en lo mismo unas cuantas veces.
Hipotéticamente (hay xx razones por las que no es así) sería bueno si los constructores genéricos pudieran definir el tipo genérico formal para toda la clase (como lo hace la declaración de clase genérica) ... Es decir, si se definen constructor genérico dejaría que tiene campos genéricos de esa clase ...
Por ejemplo si se quería evitar la generalización:
EntityRequestCallback extends RequestCallback
pero quería que el RequestCallback a ser genérica RequestCallback<E extends Entity>
, no se podía hacer eso porque solo dos tipos de solicitud PUT/POST usan Entity. Solo los constructores para las solicitudes PUT/POST contienen el parámetro Entity.
public class RequestCallback {
/** GET/DELETE requests */
public RequestCallback(String gttUrl, HttpMethod method,) {
this.gttUrl = gttUrl;
this.method = method;
}
/** PUT/POST requests */
public RequestCallback(String gttUrl, HttpMethod method, Entity entity) {
this.gttUrl = gttUrl;
this.method = method;
this.entity = entity;
}
}
Pero la clase no puede ser genérico, ya que sería la creación de RequestCallback para una solicitud que no tiene una entidad, lo que significaría que tendría una instancia
new RequestCallback(); //without specifying generic parameter - worse than nothing
Así que la única manera posible aquí se ofrecen generalización:
EntityRequestCallback<E extends Entry> extends RequestCallback
Para que pueda tener campos genéricos:
public E entity;
En este ejemplo en particular, la generalización es la elección correcta de todos modos, pero hay casos en que la generalización no lo sería.
Sí, permite que los métodos genéricos sean reemplazados por constructores (¿pero por qué querrías?). Nunca he visto uno en la naturaleza. Por mi dinero, es una complicación que el lenguaje podría haber prescindido (como C# lo hizo más tarde cuando presentó su versión de los genéricos de Java). –