Java 具有泛型方法参数、返回类型和接口的工厂

Java 具有泛型方法参数、返回类型和接口的工厂,java,generics,interface,factory,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; } 但是,

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

public <Model> Model createFromJson(String json, final Class<Model> model) { 
    Model modelInstance = gson.fromJson(json, model);
    ((IModel)modelInstance).onCreateFromJson();
    return modelInstance;
}
但是,不幸的是,我可以用任何类型的对象调用工厂方法,如:

Integer myTest = ModelFactory.getInstance().createFromJson(json, Integer.class);
因此,我想将factory方法参数定义为IModel类型。但我不知道如何传递,因为我传递的是一个类,而不是一个模型(IModel)的实例

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

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

public我想这就是你想要的

public <T extends IModel> T createFromJson(String json, Class<T> model) 
public T createFromJson(字符串json,类模型)

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

public <T extends Model> T createFromJson(String json, final Class<T> model)
{
    T modelInstance = gson.fromJson(json, model);
    ((IModel) modelInstance).onCreateFromJson();
    return modelInstance;
}
public T createFromJson(字符串json,最终类模型)
{
T modelInstance=gson.fromJson(json,model);
((IModel)modelInstance).onCreateFromJson();
返回模型实例;
}

顺便说一句,在您的定义中,所有对
Model
的引用实际上都是指模板参数,而不是模型类,我想您明白这一点了。

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

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

M extends IModel
或者将其用于示例代码:

public <M extends IModel> M createFromJson(String json, final Class<M> model) {
  // Method code
}
public M createFromJson(字符串json,最终类模型){
//方法代码
}
来自有效java:

PECS生产者扩展消费者超级

所以你可以试试这个

public <E extends IModel> E createFromJson(String json, final Class<E> model)
public E createFromJson(字符串json,最终类模型)

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

public <T extends IModel<T>> T createFromJson(String json, final Class<T> model)
{
    T modelInstance = gson.fromJson(json, model);
    ((IModel) modelInstance).onCreateFromJson();
    return modelInstance;
}
public T createFromJson(字符串json,最终类模型)
{
T modelInstance=gson.fromJson(json,model);
((IModel)modelInstance).onCreateFromJson();
返回模型实例;
}

是第二个调用java.lang.Integer中的
整数吗?如果是这种情况,那么您就不能实现它,因为
Integer
Model
(我假设您已经实现了)之间唯一通用的超类/接口可能是
Object
,而将Object强制转换为
IModel
将不可避免,如果传递了一个
整数
值,它将再次失败。谢谢大家。解决方案比预期的要简单。我会接受你所有的答案,但因为我只能接受一个,所以我选择了维格的答案,因为提示只使用一个字母作为字体。谢谢。如果你把模型改成IModel,我将投票支持你的答案。@ChristopherWill,成交!我已经编辑过了。实际上,我从一开始就不确定是否将其编码为IModel——我略过了这个问题,因为我有点忙:)
public <T extends IModel<T>> T createFromJson(String json, final Class<T> model)
{
    T modelInstance = gson.fromJson(json, model);
    ((IModel) modelInstance).onCreateFromJson();
    return modelInstance;
}