【发布时间】:2011-04-04 03:26:51
【问题描述】:
在python中,我可以做到:
args = [1,2,3,4]
f(*args) # this calls f(1,2,3,4)
这在java中可能吗?
澄清 - f 有一个可变长度的参数列表。
【问题讨论】:
标签: java python arguments variadic-functions
在python中,我可以做到:
args = [1,2,3,4]
f(*args) # this calls f(1,2,3,4)
这在java中可能吗?
澄清 - f 有一个可变长度的参数列表。
【问题讨论】:
标签: java python arguments variadic-functions
当然,您应该能够使用vararg-methods 准确地做到这一点。如果您担心Object... 等参数的歧义,那么这段代码应该澄清一下:
public class Test {
public static void varargMethod(Object... args) {
System.out.println("Arguments:");
for (Object s : args) System.out.println(s);
}
public static void main(String[] args) throws Exception {
varargMethod("Hello", "World", "!");
String[] someArgs = { "Lorem", "ipsum", "dolor", "sit" };
// Eclipse warns:
// The argument of type String[] should explicitly be cast to Object[]
// for the invocation of the varargs method varargMethod(Object...)
// from type Test. It could alternatively be cast to Object for a
// varargs invocation
varargMethod(someArgs);
// Calls the vararg method with multiple arguments
// (the objects in the array).
varargMethod((Object[]) someArgs);
// Calls the vararg method with a single argument (the object array)
varargMethod((Object) someArgs);
}
}
输出:
Arguments:
Hello
World
!
Arguments:
Lorem
ipsum
dolor
sit
Arguments:
Lorem
ipsum
dolor
sit
Arguments:
[Ljava.lang.String;@1d9f953d
您不能为非可变参数方法做到这一点。但是,非可变参数方法具有固定数量的参数,因此您应该可以这样做
nonVarargMethod(args[0], args[1], args[2]);
此外,没有办法让编译器根据数组的大小或类型解决重载方法的情况。
【讨论】:
如其他答案所建议的,可以使用 varargs 参数声明方法,并使用数组调用方法。
如果您要调用的方法没有 varargs 参数,您可以通过自省来做类似的事情,虽然它有点笨拙:
class MyClass {
public void myMethod(int arg1, String arg2, Object arg3) {
// ...code goes here...
}
}
Class<MyClass> clazz = MyClass.class;
Method method = clazz.getMethod("myMethod", Integer.TYPE, String.class, Object.class);
MyClass instance = new MyClass();
Object[] args = { Integer.valueOf(42), "Hello World", new AnyObjectYouLike() };
method.invoke(instance, args);
【讨论】:
在java中有两种使用可变参数的方法
public static void main(String... args)
或者
public static void main(String[] args)
在我的示例中,它使用字符串,但您也可以使用 int。
调用它们(这对两者都有效),
main("hello", "world");
或
main(new String[]{"hello", "world"});
【讨论】:
funct("a", "b", "c") public void funct(String s) ?!?
这里我们在方法调用时将argumentmnts传递给方法,见下面的例子,
示例说明如下;
我们有一个值为 10 的 int 变量,它是一个方法局部变量。然后我们在 print 语句中调用我们的方法 m(int x)。然后在 m(int x) 中有一个参数 int x variable ,这个 x 也是一个方法局部变量。您只能在此方法中访问它。然后在方法内部打印 x 的值,即 10,因为在方法调用时传递了一个参数 y,它保存值 10。该值 10 被分配给方法的方法局部变量 x,该变量在方法参数内部声明。现在,当我们调用 print x 时,它会打印 10。
然后创建另一个方法局部变量并将一些值添加到 x 值并分配并返回该变量。您正在返回一个值,所以现在您要检查该方法不是 void,并且具有 int 返回类型,因为 int 中的 10。
由于您的方法是在 print 语句中编写的。您的返回值也会在此程序中打印出来。所以下面是代码。
class A
{
static int m(int x)
{
System.out.println("x : "+x);
int a= x+10;
System.out.println("a : "+a);
return a;
}
public static void main(String args[])
{
int y=10;
System.out.println(m(y));
}
}
输出:
x : 10
a: 20
20
【讨论】: