0

我希望能够在不同的枚举上使用超类型,代码由三部分组成:

经理搜索:

public final List<B> search(final Order order, final Field field, final AbstractConstraint... c) throws SearchException {
    if (c.length == 0) {
        throw new IllegalArgumentException("orm.Manager.search: c.length == 0");
    }
    try {
        List<B> beans = new ArrayList<>();

        for (AbstractConstraint constraint : c) {
            try (PreparedStatement ps = new QueryBuilder(connection, tableName(), getPaths(), searchQuery()).add(constraint).order(order, field).build();ResultSet rs = ps.executeQuery()) {
                while (rs.next()) {
                    beans.add(createBean(rs));
                }
            }
        }
        return beans;
    } catch (SQLException ex) {
        Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
        throw new SearchException(ex);
    }
}

orderfield变量在这里是最重要的。

自动生成的 TemplateAttributeField.java:

public enum TemplateAttributeField implements Field {
    templateId,
    attributeOrder,
    attributeName,
    x1,
    x2;
}

和调用代码:

try (TemplateAttributeManager templateAttributeManager = ManagerFactory.getTemplateAttributeManager()) {
    List<TemplateAttributeBean> templateAttributes = null;
    try {
        templateAttributes = templateAttributeManager.search(Order.ASCENDING, TemplateAttributeField.attributeOrder, new TemplateAttributeConstraint.Builder().templateId(template.getTemplateId()).build());
    } catch (SearchException ex) {
        Logger.getLogger(OutputProcessor.class.getName()).log(Level.SEVERE, null, ex);
    }
    for (Word word : words) {

    }
}

但是在templateAttributes = ...我得到以下异常/错误:

no suitable method found for search(Order,TemplateAttributeField,TemplateAttributeConstraint)
    method Manager.search(Order,Field,AbstractConstraint...) is not applicable
      (actual argument TemplateAttributeField cannot be converted to Field by method invocation conversion)

并且Field该类不仅仅是一个不会阻止额外功能的接口。

我在这里遗漏了什么,或者我应该如何解决它?

4

1 回答 1

0

我试图创建一个最小的工作示例,但它似乎对我有用。如果这对您有用并且与您的要求相同,您可以试试吗?

public class Test {
    static interface I {}
    static enum E implements I {A}
    static void m(I i) {}

    public static void main(String[] args) {
        m(E.A);
    }
}

还要确保您在您的方法中实现相同的Field接口。enum也许存在名称冲突,并且您正在使用来自不同包的接口。

于 2013-07-16T07:44:43.573 回答