Java传播运算符

我不确定我在这里使用的词汇,如果我错了,请纠正我。

在Javascript中,我有以下代码:

let args = [1,2,3]; function doSomething (a, b, c) { return a + b + c; } doSomething(...args); 

正如你所看到的,当调用doSomething ,我能够使用... spread运算符来将我的参数“转换”为1, 2, 3

现在,我正在尝试用Java做同样的事情。

假设我有一个Foo类:

 public class Foo { public int doSomething (int a, int b, int c) { return a + b + c; } } 

现在我想打电话给doSomething

 int[] args = {1, 2, 3}; 

我想使用doSomething (...args)类的东西,而不是调用doSomething(args[0], args[1], args[2])

我看到这在函数声明中是可能的,但我不想改变这样一个函数的实现。

Java语言不提供操作员来执行此操作,但其类库具有执行所需操作的function。

[来自OP的评论] Foo的开发人员可以自己选择doSomething函数的参数数量。 然后我就可以构造一个“包”参数并将其注入方法中。

使用reflectionAPI ,这就是它的用途。 它要求您在数组中打包参数。 需要进行大量额外的工作,包括包装/解包单个方法参数和方法结果,但您可以在运行时检查签名,构造数组并调用方法。

 class Test { public static int doSomething(int a, int b, int c) { return a + b + c; } // This variable holds method reference to doSomething private static Method doSomethingMethod; // We initialize this variable in a static initialization block static { try { doSomethingMethod = Test.class.getMethod("doSomething", Integer.TYPE, Integer.TYPE, Integer.TYPE); } catch (Exception e) { } } public static void main (String[] ignore) throws java.lang.Exception { // Note that args is Object[], not int[] Object[] args = new Object[] {1, 2, 3}; // Result is also Object, not int Object res = doSomethingMethod.invoke(null, args); System.out.println(res); } } 

上面的代码打印6( 演示 )。

在java中有Variable Arguments的概念,使用它可以将不同数量的参数传递给同一个函数。

我以你的代码为例:

 public class Foo { public int doSomething (int ...a) { int sum = 0; for (int i : a) sum += i; return sum; } } 

现在您可以将此函数称为:

 doSomething (args) 

欲了解更多信息,请访问以下链接: http : //www.geeksforgeeks.org/variable-arguments-varargs-in-java/

不幸的是,你不能这样做。 扩展运算符在javascript中工作,因为允许函数接受任意类型的两个(左边的参数undefined )或太多的参数(忽略额外的参数)。 强大且静态类型的Java必须始终确切地知道在编译代码之前传递的参数的数量和类型。

你可能会发现Java 8的function接口,方法引用和var-args的hackaround,但它需要这么多的样板,我甚至不会在这里发布它。

如果你只需要通过这种方式调用几个方法,那么只需创建一个这样的包装类就可以不用Reflection:

主类(SpreadTest.java):

 public class SpreadTest { public static void main(String []args){ int[] a = {1, 2, 3}; System.out.println(new FooWrapper().doSomething(a)); // 6 } } 

你的包装类(FooWrapper.java):

 public class FooWrapper extends Foo { public int doSomething(int ...a) { return super.doSomething(a[0], a[1], a[2]); } } 

具有完成工作的方法的类(Foo.java):

 public class Foo { public int doSomething(int a, int b, int c) { return a + b + c; } } 

与许多评论相反,例如@JoeC和@Henry,以及不正确的答案,这在Java中可能的。

我想用类似的东西

 doSomething (...args) 

而不是调用doSomething(args [0],args [1],args [2])。

你需要:

 public int doSomething (int ... args) { int sum = 0; for (int i : args) { sum += i; } return sum; } 

我不想改变这种function的实现。

不可能, 先天 。 您要么添加正好三个参数,要么添加实际传递的参数。 决定这一点。