我现在明白了如何按照Java方法创建无限参数
但是我想知道将此扩展为两个参数的语法是什么,类似于printf
?
我想创建无限的String, int对。
目标是显示String1: Int1、String2: Int2等等。我只是不确定语法是什么,更不用说是否可能了。
这不是直接可行的,但这里有一些方法:
-
如果字符串是唯一的,您可以将数据作为Map传递:
public void method(Map<String,Integer> pairs) { ... }
-
可以使用两个单独的数组:
public void method(String[] strings, int[] ints) { if (strings.length != ints.length) throw new IllegalArgumentException(); ... }
调用:
method(new String[] { "a", "b", "c" }, new int[] { 1, 2, 3 });
-
一切使用
Object
,以后再整理。它的内部结构很难看,并且缺乏编译时类型检查,但它具有最短的调用语法:public void method(Object... args) { if (args.length % 2 != 0) throw new IllegalArgumentException(); for (int i = 0; i < args.length; i += 2) { String s = (String)args[i + 0]; int i = (Integer)args[i + 1]; ... } }
-
使用一个构建器样式的对象:
public Pairs method() { return new Pairs(); } // make the names here meaningful for what your method actually does public static class Pairs { private static class Pair { String s; int i; } private final List<Pair> pairs = new ArrayList<>(); private Pairs() {} public Pairs add(String s, int i) { Pair p = new Pair(); p.s = s; p.i = i; pairs.add(p); return this; } public void run() { for (Pair p : pairs) { ... do method's work here ... } } }
根据您想要实现的目标,这可能会使它过于复杂,但它为调用者提供了一种非常愉快且完全类型检查的语法:
method() .add("a", 1) .add("b", 2) .add("c", 3) .run();
首先,你不能这样做:
public void foo(String... strings, int... ints) {
因为你会得到一个错误,变量参数strings
需要是最后一个。
所以你可能想要做一个小包装类,说StringWithInt
,然后这样做:
public void foo(StringWithInt... values) {
我希望这对你有帮助!
使参数为Object参数,它有自己的问题…
public void foo(Object... things)
但是最好的办法可能是为每个参数类型使用一个泛型列表:
public void foo(List<String> strings, List<Integer> integers) {}
如果方法特别要求配对对,也可以使用Map<String, Integer>
。
为什么不直接映射呢?
像这样
public void foo(Map<String,Integer> map){
}
或者用对象代替String和int ?
public void foo(Object... args){
}