2013-01-22 36 views
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。但我无法弄清楚,因为我通过了一个类,而不是Model(IModel)的一个实例。

所以,其实我正在寻找这样的事情:

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

谁能给我建议?

+0

是'Integer'在第二个电话,java.lang的。整数?如果是这样的话,那么你不能实现这一点,因为'Integer'和'Model'(我假设你已经实现了)之间唯一的公共超类/接口可以是'Object'并将对象转换为'IModel'是不可避免的,如果一个'Integer'值被传递,这又会失败。 – melihcelik

+0

谢谢你们。解决方案比预期更简单。我会接受你所有的答案,但由于我只能接受一个答案,所以我选择了Veger的答案,因为这种类型只使用了一个字母。 –

回答

3

使用Model作为您的类型参数的名称令人困惑,因为您似乎还有一个名为Model的类。请使用M或其他字母。

要指定类型必须扩展其类,你需要使用这个:

M extends IModel 

或将其用于您的示例代码:

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

我想这是你想要的

public <T extends IModel> T createFromJson(String json, Class<T> model) 
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所有引用实际上是指的是模板参数,而不是模型类,我想你会明白这一点。

1

从有效的Java:

PECS Producer -extension-super

所以,你可以试试这个..

public <E extends IModel> E createFromJson(String json, final Class<E> model) 
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; 
} 
+0

谢谢。如果您更正模型 IModel我会upvote你的答案。 –

+0

@ChristopherWill优惠!我编辑过它。实际上,我不确定是否从一开始就将它编码为IModel - 我有点撇清了问题,因为我有点忙碌的ATM :) – Bohemian

相关问题