Java、泛型和 Classe<Generic> 问题

标签 java generics playframework ebean

这是我模型的 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() {}
}

我面临的问题:

  1. 我需要find()返回 ExpressionList<T extends Model> ,但如果我这样写,就会出错。
  2. Pb1 出现此错误,它显示“类型不匹配:无法从 ExpressionList 转换为 ExpressionList”。我想通过修复 1.,2. 也会得到修复。
  3. 这个很奇怪,它返回“绑定(bind)不匹配:ApiModel 类型的泛型方法 findById(Long) 不适用于参数 (Long)。推断类型 T&Model 不是有界参数的有效替代品”<
  4. 我当然不能用.class这个。但那我该怎么办呢?
  5. 由于模型使用注释有 @Entity ,我在这里不能使用它,它不被识别:/

我认为一切都是相关的。也许我的代码设计得很糟糕?

这是这种结构的原因。我正在使用 PlayFramework(具有静态 Controller ),并且我喜欢进行继承,从而实现通用模型。但为此,我需要实例而不是静态引用,因此 public final static AController rest 。但是,我无法访问模型的静态上下文( findfindById )。所以我做了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/

相关文章:

java - 为什么这个 JPanel 不可见?

Java ImageIcons 和 Action 监听器

java - 如何使我的自定义链表使用泛型?

java - 为什么 play.libs.Json.toJson 返回一个空对象?

scala - PlayFramework Scala 测试 - 通过依赖注入(inject)器获取类的实例

mysql - 在模型中玩 2.0 MySql 关键字

java - 使用kafka流根据消息 key 向主题发送消息

java - 如何使用 JRuby 正确打包?

.net - 为什么某些 .NET Framework 类在可以时不使用泛型?

swift - 在泛型类中传递泛型参数