[英]In Java, why is the call foo() not ambigious given 2 varags methods foo(int… ints) and foo(Object… objects)?
[英]Why is it not allowed in Java to overload Foo(Object…) with Foo(Object[])?
我想知道為什么不允許Java用Foo(Object... args)
重載Foo(Object[] args)
Foo(Object... args)
,盡管它們以不同的方式使用?
Foo(Object[] args){}
使用方式如下:
Foo(new Object[]{new Object(), new Object()});
而另一種形式:
Foo(Object... args){}
使用方式如下:
Foo(new Object(), new Object());
這背后有什么原因嗎?
此15.12.2.5選擇最具體的方法對此進行了討論,但它相當復雜。 例如,在Foo(Number ... ints)和Foo(Integer ... ints)之間進行選擇
為了向后兼容,這些實際上是同一件事。
public Foo(Object... args){} // syntactic sugar for Foo(Object[] args){}
// calls the varargs method.
Foo(new Object[]{new Object(), new Object()});
例如,您可以將main()定義為
public static void main(String... args) {
一種使它們與眾不同的方法是在varargs之前接受一個參數
public Foo(Object o, Object... os){}
public Foo(Object[] os) {}
Foo(new Object(), new Object()); // calls the first.
Foo(new Object[]{new Object(), new Object()}); // calls the second.
它們並不完全相同。 細微的差別是,盡管您可以將數組傳遞給varargs,但不能將數組參數視為varargs。
public Foo(Object... os){}
public Bar(Object[] os) {}
Foo(new Object[]{new Object(), new Object()}); // compiles fine.
Bar(new Object(), new Object()); // Fails to compile.
此外,變量必須是最后一個參數。
public Foo(Object... os, int i){} // fails to compile.
public Bar(Object[] os, int i) {} // compiles ok.
這個問題的最直接答案是擁有兩個聲明會在方法查找邏輯中造成歧義。 如果您在同一個類中聲明了兩者,則無法確定因此調用時要使用的方法:
Object[] a = new Object[10];
Foo(a); // array or vararg?
Java要求每次方法調用都必須有最特定的方法。 關於為什么 ,請參閱彼得的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.