[英]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.