繁体   English   中英

为什么在Java中不允许Foo(Object [])重载Foo(Object…)?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM