2017-09-24 48 views
5

我不确定我在这里使用的词汇,如果我错了,请纠正我。Java传播运算符

在Javascript中,我有以下代码:

let args = [1,2,3]; 

function doSomething (a, b, c) { 
    return a + b + c; 
} 

doSomething(...args); 

正如你所看到的,在调用的时候doSomething,我能够使用...传播经营者,以“改造”我的论点为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])

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

+7

不能这样做。抱歉。 –

+1

这在Java中是不可能的。你可以有另一个需要4个整数参数的方法。在编译时你不会知道要调用哪一个,因为它取决于只在运行时知道的列表长度。 – Henry

+0

真的。 Java语法不提供这样的机制。为什么要打扰它? [XY问题?](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)最后,这个问题没有用。 – Seelenvirtuose

回答

0

Java语言不提供一个操作符来完成这个任务,但是它的类库有一个功能来执行你所需要的操作。

[来自OP的评论] Foo的开发人员可以自己选择函数doSomething需要的参数个数。然后,我将能够构建一个“袋子”的参数,并在方法中注入它。

使用反射API,这是它是什么。它要求你将参数打包在一个数组中。需要做很多额外的工作,包括打包/解包个别方法参数和方法结果,但是您可以在运行时检查签名,构建数组并调用方法。

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(demo)。

0

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

我在你的代码为例:

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/

+0

我认为这种方法是OP暗示的,当他写道:“我发现这在函数声明中是可能的,但是我不想改变这个函数的实现。” – dasblinkenlight

+0

问题是关于完全不同的事情。 –

0

与许多评论相反,例如,通过@JoeC和@Henry,并且不正确的答案,这个可能在Java中。

我想使用类似

doSomething (...args) 

代替调用doSomething的(参数[0],ARGS [1],ARGS [2])。

您需要:

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

我想不改变这样的功能的实现。

Impossible,priori。要么加入三个参数,要么加入实际传递的参数。对此做出决定。

+2

我认为这种方法是OP在他写道“我发现这在函数声明中是可能的”时暗示的,但我不想改变这样的函数的实现。 – dasblinkenlight

+0

@dasblinkenlight这是一个矛盾的术语。他想要总结任意数量的论点,或者三个。不是在同一时间。 – EJP

+0

我认为他想精确地总结三个参数,但是他希望将它们打包在一个三元素数组中以便进行调用。 – dasblinkenlight

0

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

你或许可以找到一个Java 8的函数接口,方法引用和var-args的方法,但它会需要很多样板,我甚至不会在这里发布它。