java - 如何在 Java 中动态地将参数作为可变参数传递
问题描述
我正在尝试编写一个程序,它将未知数量的数组作为用户的输入,然后从它们中打印,我编写的 print 函数采用可变参数。
所以我要做的是在我的主要方法调用中print(arr1, arr2, arr3...)
并动态更改它,这样我就不必对可以传入的数组数量设置限制。
我最初的想法是将所有数组存储在 2d ArrayList 中,然后将它们解包,就像 JavaScript 如何使用扩展运算符一样,您可以在其中拥有 2d 数组,然后执行print(...inputArrays)
,但 Java 似乎不允许这样做。
解决方案
这种方法:
public void foo(String... args) {}
实际上与以下内容相同:
public void foo(String[] args) {}
真的 - 检查字节码,它是相同的签名。或者尝试将这两种方法都放在一个类中——编译器不会让你这样做,因为它们具有相同的签名。String...
和之间的一个区别String[]
是任何调用者都String...
可以获得以下语法糖: 获取在此位置传递的所有参数并为它们创建一个数组。
因此,调用 varargs 方法并传入数组可以正常工作:
public void foo(String... args) {
}
String[] a = new String[10];
foo(a); // compiles and runs fine.
问题是java中的数组相当笨拙,但可变参数是基于它们的。你在避免它们的正确轨道上,但是当你试图动态调用可变参数方法时,你被迫使用它们。更糟糕的是,泛型和数组也不能很好地混合。尽管如此:
getPermutations(inputArrayList.toArray(ArrayList[]::new));
应该带你到某个地方(这会将arraylist转换为数组)。
推荐阅读
- git - 如何检查git分支是否是新创建的?
- c++ - Assimp 动态链接问题 C++, Directx11
- android - mergeExtDexDebug 失败,类型定义多次错误
- javascript - 在 React Native WebView 中注入 JavaScript 后渲染屏幕
- oracle-apex - 使用默认值更新列
- acumatica - 如何在 acumatica 中为具有不同下拉值的每一行动态加载下拉值?
- bash - Bash yad ComboBox 参数作为数组
- ruby-on-rails - find_or_initialize 响应中缺少与日期相关的列
- reactjs - 快速回复新闻功能(有天赋的聊天)反应原生
- javascript - 确定 Kendo UI 控件的类型