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

使用Modelas name 为您的类型参数是令人困惑的,因为您似乎也有一个名为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 回答