2

モデル インスタンスを作成するためのファクトリがあります。ファクトリは次のメソッドを提供します。

public <Model> Model createFromJson(String json, final Class<Model> model) { 
    Model modelInstance = gson.fromJson(json, model);
    ((IModel)modelInstance).onCreateFromJson();
    return modelInstance;
}

ご覧のとおり、モデルのインスタンス (以前はクラス メソッドのパラメーターとして指定) をインターフェイスにキャストしているため、特定のメソッドを呼び出すことができます。さらに、呼び出し元がオブジェクトをキャストしてはならないため、一般的な戻り値の型もうまく機能します。次のように呼び出すだけで十分です。

MyModel myModel = ModelFactory.getInstance().createFromJson(json, MyModel.class);

しかし、残念ながら、次のような任意の種類のオブジェクトでファクトリ メソッドを呼び出すことができます。

Integer myTest = ModelFactory.getInstance().createFromJson(json, Integer.class);

そこで、ファクトリ メソッドのパラメーターを IModel 型に定義したいと思います。しかし、モデル (IModel) のインスタンスではなく、クラスを渡しているため、その方法がわかりません。

だから、実際に私はこのようなものを探しています:

public <Model<? extends IModel>> Model 
    createFromJson(String json, final Class<Model<? extends IModel>> model) 

誰でも私にアドバイスをもらえますか?

4

5 に答える 5

3

Modelという名前のクラスもあるように見えるため、型パラメーターの名前として使用すると混乱しますModel。代わりにMまたは他の文字を使用してください。

型が拡張する必要があるクラスを指定するには、これを使用する必要があります。

M extends IModel

または、サンプルコードに使用します:

public <M extends IModel> M createFromJson(String json, final Class<M> model) {
  // Method code
}
于 2013-01-22T09:19:04.503 に答える
2

これがあなたの望むものだと思います

public <T extends IModel> T createFromJson(String json, Class<T> model) 
于 2013-01-22T09:17:23.757 に答える
2

このメソッドは、テンプレートパラメータの境界を次のように定義する必要があります。

public <T extends Model> T createFromJson(String json, final Class<T> model)
{
    T modelInstance = gson.fromJson(json, model);
    ((IModel) modelInstance).onCreateFromJson();
    return modelInstance;
}

ところで、あなたの定義では、へのすべての参照Modelは実際にはModelクラスではなく、テンプレートパラメータを参照しているので、その点を理解していると思います。

于 2013-01-22T09:17:31.913 に答える
2

私はこれがあなたが望むものだと思ったでしょう:

public <T extends IModel<T>> T createFromJson(String json, final Class<T> model)
{
    T modelInstance = gson.fromJson(json, model);
    ((IModel) modelInstance).onCreateFromJson();
    return modelInstance;
}
于 2013-01-22T09:20:12.273 に答える
1

有効な Java から:

PECS Producer-extends consumer-super

だからあなたはこれを試すことができます..

public <E extends IModel> E createFromJson(String json, final Class<E> model)
于 2013-01-22T09:19:10.350 に答える