传递枚举和String varargs的Java错误

时间:2014-03-26 12:44:16

标签: java enums lotus-domino variadic-functions

我需要了解我遇到的问题。我有一个带有签名addTerm(enum, String, String...)的方法,但是当使用它时我得到一个错误,上面写着 FTSearchBuilder类型中的方法addTerm(Comparison,String,String ...)不适用于参数(比较,String,String,String) - 如果我只传递一个字符串,我也会得到相同的错误。最初,我认为这是我的vararg的问题,但通过测试我发现如果我将比较中的初始参数更改为String,我的方法就可以了。但是,我没有在其他方法中传递枚举的问题。任何人都可以解释发生了什么以及如何解决这个问题吗?

以下代码,以防有用。

错误

FTSearchBuilder sb = new FTSearchBuilder();
sb.addTerm(Comparison.EQ, "Form", "frmClaim", "frmClaimstub");

工作(稍微修改addTerm以使用String而不是枚举)

FTSearchBuilder sb = new FTSearchBuilder();
sb.addTerm("=", "Form", "frmClaim", "frmClaimstub");

比较

public enum Comparison {
    LT("<"), LTE("<="), EQ("="), GTE(">="), GT(">");

    private final String text;

    private Comparison(String text) {
        this.text = text;
    }

    public String getText() {
        return this.text;
    }
}

addTerm()(在FTSearchBuilder类中)

public class FTSearchBuilder {
private String query;

public FTSearchBuilder() {
    query = "";
}

public String getQuery() {
    return this.query;
}

public void addTerm(Comparison operator, String fieldName, String... values) {
    // Validate input
    String queryTerm = "";
    if (0 == values.length) {
        throw new ArrayIndexOutOfBoundsException("No comparison values given");
    }
    for (int x = 0; x < values.length; x++) {
        if (!StringUtil.isEmpty(values[x])) {
            if (queryTerm.equals("")) {
                queryTerm += "([" + fieldName + "]" + operator.getText() + enquote(values[x]);
            } else {
                queryTerm += " | [" + fieldName + "]" + operator.getText() + enquote(values[x]);
            }
            queryTerm += ")";
        }
    }

    if (!query.equals("")) {
        this.query += "&";
    }
    this.query += queryTerm;
}

public void addDateTerm(Comparison operator, String fieldName, String... values) {
    // Validate input
    String queryTerm = "";
    if (0 == values.length) {
        throw new ArrayIndexOutOfBoundsException("No comparison values given");
    }
    for (int x = 0; x < values.length; x++) {
        if (!StringUtil.isEmpty(values[x])) {
            if (queryTerm.equals("")) {
                queryTerm += "([" + fieldName + "]" + operator.getText() + values[x];
            } else {
                queryTerm += " | [" + fieldName + "]" + operator.getText() + values[x];
            }
            queryTerm += ")";
        }
    }

    if (!query.equals("")) {
        this.query += "&";
    }
    this.query += queryTerm;
}

private String enquote(String s) {
    return "\"" + s + "\"";
}
}

2 个答案:

答案 0 :(得分:1)

仅适用于未来的问题排查工具 - 问题不在代码中。我一直在将可重用代码打包到插件中以便在其他应用程序中使用,其中包括所有内容。我仍然拥有该软件包的本地副本,并且插件已添加到构建路径中,因此有两个相同的软件包和类副本。

当我更改FTSearchBuilder的签名时,编译器能够告诉我使用的是哪一个因为它们有不同的签名并且它开始工作,但是当我将其更改回来时它再次变得模棱两可并标记错误。 / p>

我删除了本地副本,一切正常。

答案 1 :(得分:-1)

我做了以下测试并且工作正常:

public class Test {
    enum Comparison {
        LT("<"), LTE("<="), EQ("="), GTE(">="), GT(">");

        private final String text;

        private Comparison(String text) {
            this.text = text;
        }

        public String getText() {
            return this.text;
        }
    }

    public static void main(String[] args) {
        addTerm(Comparison.EQ, "Form", "frmClaim", "frmClaimstub");
    }

    private static void addTerm(Comparison operator, String fieldName, String... values) {
        System.out.println(operator.toString());
        System.out.println(fieldName);

        if (values != null && values.length > 0){
            for (String v : values) {
                System.out.print(v + " ");
            }
        }

        System.out.println();
        System.out.println();
    }
}

输出:

EQ
Form
frmClaim frmClaimstub 

请你把堆栈跟踪发给我们吗?