Да, я думал об этом несколько раз.
Гипотетически (есть xx причины, по которым это не так) было бы неплохо, если бы конструкторы Generic могли определять формальный универсальный тип для всего класса (как это делает объявление универсального класса) ... То есть, если определить Generic конструктор позволит вам иметь общие поля в этом классе ...
Например, если вы хотите избежать обобщения:
EntityRequestCallback extends RequestCallback
но вы хотели, чтобы RequestCallback был универсальным RequestCallback<E extends Entity>
, вы не могли этого сделать, потому что только два типа запроса PUT / POST используют Entity. Только конструкторы для запросов PUT / POST содержат параметр 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;
}
}
Но класс не может быть универсальным, потому что вы создадите RequestCallback для запроса, который не имеет сущности, что означает, что вы создадите экземпляр
new RequestCallback(); //without specifying generic parameter - worse than nothing
Так что единственный возможный путь здесь - обобщение:
EntityRequestCallback<E extends Entry> extends RequestCallback
Так что вы можете иметь общие поля:
public E entity;
В этом конкретном примере обобщение является правильным выбором в любом случае, но есть случаи, когда обобщение не будет.