[英]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.