Java方法调用是不明确的

时间:2017-08-06 04:39:23

标签: java compiler-errors

有两种方法:

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

不解.....

3 个答案:

答案 0 :(得分:2)

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

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

考虑

integerTermsQuery

objectTermsQuery

修改

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

答案 1 :(得分:2)

这是不明确的,因为1可以自动转换为IntegerObject签名接受int。它也可以被Object...签名直接接受。

你应该通过重命名方法或没有这样的通用参数列表(AVAudioEngine)来明确这两个方法

答案 2 :(得分:1)

如果存在<any primitive>...,则使用varargs Object...的所有构造函数都不能使用逗号分隔的基元列表直接调用,因为所有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]);
  }
 }
}