繁体   English   中英

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

[英]Factory with generic method parameter, return type and interface

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

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类型。 但我无法弄清楚如何,因为我传递的是一个类,而不是一个Model(IModel)的实例。

所以,实际上我正在寻找这样的东西:

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

谁能给我建议?

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

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

M extends IModel

或者将它用于示例代码:

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

我想这就是你想要的

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

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

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类,我猜你得到了这一点。

我原本以为这就是你想要的:

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

来自Effective java:

PECS Producer扩展了消费者超级市场

所以你可以试试这..

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM