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的实现。
不可能, 先天 。 您要么添加正好三个参数,要么添加实际传递的参数。 决定这一点。