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;
}