[英]Java method call is ambiguous
有两种方法:
public static TermsQueryBuilder termsQuery(String name, int... values) {
return new TermsQueryBuilder(name, values);
}
public static TermsQueryBuilder termsQuery(String name, Object... values) {
return new TermsQueryBuilder(name, values);
}
我打电话的时候
termsQuery("operatorType", 1);
它说这是模棱两可的。
请帮忙 ...
所有方法都在Elasticsearch中,例如:
public static TermsQueryBuilder termsQuery(String name, String... values) {
return new TermsQueryBuilder(name, values);
}
public static TermsQueryBuilder termsQuery(String name, int... values) {
return new TermsQueryBuilder(name, values);
}
public static TermsQueryBuilder termsQuery(String name, long... values) {
return new TermsQueryBuilder(name, values);
}
...
public static TermsQueryBuilder termsQuery(String name, Object... values) {
return new TermsQueryBuilder(name, values);
}
当我调用termsQuery("operationType","1")
,并不含糊。
当我调用termsQuery("operationType",1)
,含糊不清。
当我调用termsQuery("operationType",Arrays.asList(searchParam.getOperatorType())
,并不含糊。
困惑.....
只需重命名一个或两个方法,错误就会消失。
您不能使用您希望的签名重载此方法,因为您的调用可以由两个方法定义匹配,并且int
和Object
类型不在超类 - 子类关系中,因此两者都不比另一个更具体。
考虑
integerTermsQuery
和
objectTermsQuery
编辑
正如您在注释中指出的那样,带有String...
参数的版本与Object...
不冲突Object...
并且数组与String
是Object
的子类是协变的。
这是不明确的,因为1
可以自动转换为Integer
,这是Object
签名所接受的。 它也可以由int
签名直接接受。
您应该通过重命名方法或不具有这样的通用参数列表( Object...
)来明确这两种方法Object...
如果Object...
存在,那么使用varargs <any primitive>...
所有构造函数都不能使用逗号分隔的基元列表直接调用,因为对于所有这些Object...
都是不明确的。 编译器错误消息明确指出。
我们可以使用数组调用它们:
termsQuery("operatorType", new int[]{1, 2, 3})
。
TermsQueryBuilder termsQuery(String name, Object... values)
和TermsQueryBuilder termsQuery(String name, String... values)
因为String
也是一个Object
它是一个比Object
更特殊的对象。
以下代码有效,应该显示正是发生的情况:
public class TestAmbiguous {
public static TermsQueryBuilder termsQuery(String name, int... values) {
return new TermsQueryBuilder(name, values);
}
public static TermsQueryBuilder termsQuery(String name, double... values) {
return new TermsQueryBuilder(name, values);
}
public static TermsQueryBuilder termsQuery(String name, Object... values) {
return new TermsQueryBuilder(name, values);
}
public static TermsQueryBuilder termsQuery(String name, String... values) {
return new TermsQueryBuilder(name, values);
}
public static void main(String[] args) {
TermsQueryBuilder builder;
builder = termsQuery("operatorType", 1, 1.0, 1.0f, "test", new Integer(1), new Double(1), new Float(1), new String("test"));
builder = termsQuery("operatorType", "test", new String("test"));
builder = termsQuery("operatorType", new int[]{1, 2, 3});
builder = termsQuery("operatorType", new double[]{1, 2, 3});
builder = termsQuery("operatorType", new float[]{1, 2, 3});
builder = termsQuery("operatorType", (Object[]) new Float[]{1f, 2f, 3f});
}
}
class TermsQueryBuilder {
TermsQueryBuilder(String name, int... values) {
System.out.println("_____________________________________");
System.out.println("primitive int");
for (int i = 0 ; i < values.length; i++) {
System.out.println(values[i]);
}
}
TermsQueryBuilder(String name, double... values) {
System.out.println("_____________________________________");
System.out.println("primitive double");
for (int i = 0 ; i < values.length; i++) {
System.out.println(values[i]);
}
}
TermsQueryBuilder(String name, Object... values) {
System.out.println("_____________________________________");
System.out.println("Any objects");
for (int i = 0 ; i < values.length; i++) {
System.out.println(values[i].getClass());
System.out.println(values[i]);
}
}
TermsQueryBuilder(String name, String... values) {
System.out.println("_____________________________________");
System.out.println("String objects");
for (int i = 0 ; i < values.length; i++) {
System.out.println(values[i].getClass());
System.out.println(values[i]);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.