我有一个用于创建模型实例的工厂。工厂提供这种方法:
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)
有人可以给我建议吗?
答案 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)