数组参数声明会导致语法错误发生调用。然而,main方法使用String []而不是String ...我如何理解这种不一致?
package domain.test;
import utilities.CConsole;
public class Tester {
public static void main(String[] args)
{
Test1 t = new Test1();
t.method1(0); // the array will exist but have a length of zero
t.method1(0, (Object[])null); // the array will not exist
t.method1(0, "a");
t.method1(0, "a", "b");
CConsole.pw.format("\n");
t.method2(0); // the array will exist but have a length of zero
t.method2(0, (String[])null); // the array will not exist
t.method2(0, "a");
t.method2(0, "a", "b");
CConsole.pw.format("\n");
}
}
class Test1 {
void method1(int number, Object... args) // Object[] causes syntax errors
{
if (args == null)
CConsole.pw.format("args == null\n");
else
{
CConsole.pw.format("args != null ");
CConsole.pw.format("args.length %d\n", args.length);
}
}
void method2(int number, String... args) // String[] causes syntax errors
{
if (args == null)
CConsole.pw.format("args == null\n");
else
{
CConsole.pw.format("args != null ");
CConsole.pw.format("args.length %d\n", args.length);
}
}
}
如何解释不一致?
对于说它编译的人包括以下内容:要获得此错误,请将method1()更改为使用Object []。
摘要编辑:这一课似乎就是这样。正如@Andrew Barber强调的那样,String ...与String []不同。它们are not
通常可以互换,所以不要试图以同样的方式对待它们(尽管我可以说出它们看起来可以互换的原因)。在main()的情况下,它们 可互换。在main()
的情况下,有些人可能称之为糖。
答案 0 :(得分:5)
在该语言的更高版本中添加了Varargs。实际上,如果你想要String ...
,你可以在支持varargs的Java版本中使用String[]
而不是main
。
答案 1 :(得分:3)
我认为你对有效的数组参数看起来很困惑。 varargs参数意味着您可以传递0或更多任何类型的定义。如果没有歧义,你可以传递一个数组,数组的内容将扩展到varargs参数。
另一方面,数组参数意味着您必须传递一个数组。使用Object[]
和String[]
替换varargs参数时,示例中的错误来自您调用方法的方式。例如:
t.method1(0, "a", "b");
这适用于varargs调用,但只要将varargs参数切换为Object[]
,之前的方法调用就需要更改为:
t.method(0, new Object[]{"a", "b"});
或
t.method(0, new String[]{"a", "b"});
因为数组允许多态性。相反,如果你的方法使用varargs,传递数组就可以了。所以你看,main
方法没有不一致。 String[]
或String...
都有效,因为您遇到的问题涉及方法的方式,而不是如何定义。
更新:由于您似乎在寻找细节,5.2 Virtual Machine Start-Up上的JVMS说
Java虚拟机通过调用方法main来开始执行 一些指定的类,传递一个参数,这是一个数组 字符串。
如果最后一个形式参数是类型为T的变量arity参数, 它被认为是定义T []类型的形式参数。方法 然后是一个可变的arity方法。否则,它是一个固定的arity 方法。变量arity方法的调用可能包含更多实际值 参数表达式比形式参数。所有的实际论点 表达式与前面的形式参数不对应 将评估变量arity参数并存储结果 到将传递给方法调用的数组。
因此,在应用程序启动时调用main方法总是传递String[]
,并且相应的方法总是将varargs参数作为数组接收,因此在任何地方都没有任何不一致。
答案 2 :(得分:2)
通常,您可以使用varargs指定方法将可变数量的参数作为输入这一事实。因此,集合,数组和简单的单个对象可以在java中互换发送。这简化了方法,但有一些问题。
如果
,Varargs会自然地工作1)它们位于方法签名的END处 2)您定义为var arg的数据类型是线性的(即数组或集合)。
正如您所知,main(String [] args)因此非常适合使用var args(也就是说,args位于方法的末尾,它是最后一个参数,因此它实际上与将“String ... args”声明为最后一个参数)。为了更好地理解它们,我建议编写这两种方法并观察编译器的作用:
所以回答你的问题:你很幸运:)你的方法是向main方法发送可变数量的参数,新版本的java允许你将var args作为main的输入。
答案 3 :(得分:0)
简短且唯一正确的答案是您可以使用其中一种。
答案 4 :(得分:-4)
String []表示字符串数组。拥有单个字符串是不够的,因为您可能希望使用更多参数运行程序。所谓的“不一致”对于面向对象技术来说是正常的。来自不同类的两个对象可能表现不同。只有初学者称之为“不一致”。阅读面向对象的范例,您将能够自己找到答案。