Factory具有通用方法参数,返回类型和接口

时间:2013-01-22 09:07:38

标签: java generics interface factory

我有一个用于创建模型实例的工厂。工厂提供这种方法:

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) 

有人可以给我建议吗?

5 个答案:

答案 0 :(得分:3)

使用Model作为类型参数的名称会让人感到困惑,因为您似乎还有一个名为Model的类。而是使用M或其他一些字母。

要指定类型必须扩展的类,您需要使用它:

M extends IModel

或者将其用于示例代码:

public <M extends IModel> M createFromJson(String json, final Class<M> model) {
  // Method code
}

答案 1 :(得分:2)

我认为这就是你想要的

public <T extends IModel> T createFromJson(String json, Class<T> model) 

答案 2 :(得分:2)

该方法应定义模板参数的界限,如下所示:

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

BTW,在你的定义中,对Model的所有引用实际上都是指模板参数,而不是Model类,我想你会明白这一点。

答案 3 :(得分: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;
}

答案 4 :(得分:1)

来自Effective java:

  

PECS Producer-extends consumer-super

所以你可以尝试这个..

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