Eng*_*uad 13 java parameters methods arguments language-specifications
我想知道为什么它是Java不允许超负荷Foo(Object[] args)使用Foo(Object... args),虽然他们都以不同的方式使用?
Foo(Object[] args){}
Run Code Online (Sandbox Code Playgroud)
使用如下:
Foo(new Object[]{new Object(), new Object()});
Run Code Online (Sandbox Code Playgroud)
而另一种形式:
Foo(Object... args){}
Run Code Online (Sandbox Code Playgroud)
使用如下:
Foo(new Object(), new Object());
Run Code Online (Sandbox Code Playgroud)
这背后有什么理由吗?
Pet*_*rey 25
这个15.12.2.5选择最具体的方法谈论这个,但它非常复杂.例如,在Foo(Number ... int)和Foo(Integer ... int)之间选择
为了向后兼容,这些实际上是相同的.
public Foo(Object... args){} // syntactic sugar for Foo(Object[] args){}
// calls the varargs method.
Foo(new Object[]{new Object(), new Object()});
Run Code Online (Sandbox Code Playgroud)
例如,您可以将main()定义为
public static void main(String... args) {
Run Code Online (Sandbox Code Playgroud)
使它们与众不同的一种方法是在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.
Run Code Online (Sandbox Code Playgroud)
它们并不完全相同.细微的区别在于,虽然您可以将数组传递给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.
Run Code Online (Sandbox Code Playgroud)
另外,varags必须是最后一个参数.
public Foo(Object... os, int i){} // fails to compile.
public Bar(Object[] os, int i) {} // compiles ok.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1044 次 |
| 最近记录: |