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])

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

原文由 Hammerbot 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

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

原文由 Sergey Kalinichenko 发布,翻译遵循 CC BY-SA 3.0 许可协议

在 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/

原文由 Nishesh Pratap Singh 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏