繁体   English   中英

Java方法调用是不明确的

[英]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()) ,并不含糊。

困惑.....

只需重命名一个或两个方法,错误就会消失。

您不能使用您希望的签名重载此方法,因为您的调用可以由两个方法定义匹配,并且intObject类型不在超类 - 子类关系中,因此两者都不比另一个更具体。

考虑

integerTermsQuery

objectTermsQuery

编辑

正如您在注释中指出的那样,带有String...参数的版本与Object...不冲突Object...并且数组与StringObject的子类是协变的。

这是不明确的,因为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM