私は同じことについて数回考えていました。
仮説的には(これはなぜそうでないのかという理由があります)、ジェネリックなコンストラクタが(ジェネリッククラス宣言のように)クラス全体の正式なジェネリック型を定義できるといいでしょう...つまり、
EntityRequestCallback extends RequestCallback
しかし、あなたは、あなたがそれを行うことができませんでした、RequestCallbackは一般的な
RequestCallback<E extends Entity>
になりたかった:あなたが一般化を避けたい場合、一般的なコンストラクタは...あなたはそのクラスの一般的なフィールドを持っている。例えば
を聞かせ要求PUT/POSTの2種類だけがエンティティを使用するためです。 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;
}
}
しかし、あなたは、あなたが
new RequestCallback(); //without specifying generic parameter - worse than nothing
をインスタンス化します意味しますエンティティを、持っていない要求に対するRequestCallbackを作成することになるため、クラスは、一般的なことはできませんだから、ここでの唯一の可能な方法ある一般化:あなたが持つことができるように
EntityRequestCallback<E extends Entry> extends RequestCallback
汎用フィールド:
public E entity;
この特定の例では、一般化は正しい選択ですが、一般化が行われない場合があります。
ええ、一般的なメソッドをコンストラクタに置き換えることができます(しかし、なぜそうしたいでしょうか?)。私は実際に野生のものを見たことはありません。私のお金のために、言語が(Javaジェネリックスのバージョンを発表した後のC#のように)言語ができなかったことは複雑です。 –