簡體   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