这是我模型的 parent :
abstract public class ApiModel {
// Problem 1
public static ExpressionList<Model> find() {
return null;
}
public static <T extends Model> T findById(Long id) {
return null;
}
}
模型:
public class MyModel extends ApiModel {
private static Model.Finder<Long,MyModel> find = new Model.Finder(Long.class, MyModel.class);
public static ExpressionList<MyModel> find() {
return find.where();
}
public static MyModel findById(Long id) {
return find.byId(id);
}
}
父级 Controller :
public class ApiController<T extends ApiModel> extends Controller {
public Result list() {
// Problem 2
ExpressionList<T> list = T.find();
return ok(Json.toJson(list.orderBy("name"), 10));
}
public Result create() {
return update(null);
}
public Result details(Long id) {
// Problem 3
T model = T.findById(id);
// ...
return ok(result);
}
public Result update(Long id) {
// Problem 4
Form<T> form = form(T.class).bindFromRequest();
T model = form.get();
// Problem 5
T.save();
// ...
return ok(result);
}
public Result delete(Long id) {
// ...
return ok(result);
}
}
Controller
public class AController extends ApiController<MyModel> {
public final static AController rest = new AController();
private AController() {}
}
我面临的问题:
- 我需要
find()
返回ExpressionList<T extends Model>
,但如果我这样写,就会出错。 - Pb1 出现此错误,它显示“类型不匹配:无法从 ExpressionList 转换为 ExpressionList”。我想通过修复 1.,2. 也会得到修复。
- 这个很奇怪,它返回“绑定(bind)不匹配:ApiModel 类型的泛型方法 findById(Long) 不适用于参数 (Long)。推断类型 T&Model 不是有界参数的有效替代品”<
- 我当然不能用
.class
这个。但那我该怎么办呢? - 由于模型使用注释有
@Entity
,我在这里不能使用它,它不被识别:/
我认为一切都是相关的。也许我的代码设计得很糟糕?
这是这种结构的原因。我正在使用 PlayFramework(具有静态 Controller ),并且我喜欢进行继承,从而实现通用模型。但为此,我需要实例而不是静态引用,因此 public final static AController rest
。但是,我无法访问模型的静态上下文( find
和 findById
)。所以我做了ApiModel。但这也没有什么帮助。
最佳答案
如果您重写了一点 ApiController
,则不需要 ApiModel
类:
public class ApiController<T extends Model> extends Controller {
private Model.Finder<Long,T> finder;
private final Class<T> modelClass;
public ApiController(Class<T> modelClass) {
this.modelClass = modelClass;
finder = new Model.Finder(Long.class, modelClass);
}
public Result list() {
ExpressionList<T> list = finder.where();
return ok(Json.toJson(list.orderBy("name"), 10));
}
public Result details(Long id) {
T model = finder.findById(id);
// ...
return ok(result);
}
public Result update(Long id) {
// Problem 1
Form<T> form = form(modelClass).bindFromRequest();
T model = form.get();
T.save();
// ...
return ok(result);
}
...
}
public class AController extends ApiController<MyModel> {
public final static AController rest = new AController();
private AController() {
super(MyModel.class);
}
}
关于Java、泛型和 Classe<Generic> 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11915529/