4

关于Varargs,我可以重复一组中的论点吗?

例如,我想允许用户传入:

myFunc(1, "one");
myFunc(1, "one", 2, "two");
myFunc(1, "one", 2, "two", 3, "three");

这似乎是不可能的。但正如文档中提到的,可变参数实际上是一个数组,在旧实现中。我想知道发明可变参数之前人们是怎么做的。这可能会启发我们如何实现上述场景。我们可以认为我的场景毕竟是重复的。{int, String}...

感谢您的任何输入:-)

编辑:

感谢您的所有投入!

那么,它的调用方式myFunc(new wrap(1, "one"), new wrap(2, "two"), new wrap(3, "three"));方法吗?

编辑2:

嗯,不。那是我混乱的错。

为了

myFunc(1);
myFunc(1, 2);
myFunc(1, 2, 3);

的方式应该是

myFunc(new int[]{1});
myFunc(new int[]{1, 2});
myFunc(new int[]{1, 2, 3});

据我所知,重复的参数形成一个数组。它的所有参数必须是同一类型。以简单的方式实现上述调用应该是不可能的。出于好奇,我开始考虑运算符重载的可能性......(?)

4

4 回答 4

4

在这种情况下,在我看来,为您的“对”创建一个数据结构,然后将该类型用作您的方法的 vararg 参数是合适的。

public void myFunc(Pair... pairs) {}

您也可以使用Object...,但在这种情况下我看不到任何优势,因为参数总是成对出现。

于 2013-04-13T09:48:42.627 回答
2

创建一个将两个参数包装在一起的包装类怎么样?

public class TwoParameter
{
    private int intValue;
    private String stringValue;

    public TwoParameter(int intValue, String stringValue)
    {
        this.intValue = intValue;
        this.stringValue = stringValue;
    }

    // getters and setters
}

然后像这样使用它:

myFunc(new TwoParameter(1, "one"), new TwoParameter(2, "two"));

该方法的签名将是这样的:

public void myFunc(TwoParameter... params){...}
于 2013-04-13T09:50:18.197 回答
2

引入 Var args 是为了允许您向函数发送任意数量的参数。人们在其他集合/数组出现之前就对它们进行了破解。

您可以通过自定义结构实现您想要的。结构的细节将取决于名称值对应该实现什么。这是任何 NameValue 对的通用解决方案。

名称值对

class NameValuePair<K,V>
{
    private K key;
    private V value;
    public K getKey()
    {
        return key;
    }
    public void setKey(K key)
    {
        this.key = key;
    }
    public V getValue()
    {
        return value;
    }
    public void setValue(V value)
    {
        this.value = value;
    }
}

用法

private <K,V> void method(NameValuePair<K, V>... pairs )
{
    for (NameValuePair<K, V> nameValuePair : pairs)
    {
        K key = nameValuePair.getKey();
        V value = nameValuePair.getValue();
        // logic goes here 
    }
}
于 2013-04-13T09:54:50.280 回答
2

使用其他解决方案有充分的理由,但它们都引入了一些混乱(创建所有这些对象),您可能不想让图书馆的用户受到影响。

您可以将混乱转移到您的方法内部,如下所示:

public void example(final Object... args) {
    if (args.length % 2 != 0)
        throw new IllegalArgumentException("int, String pairs are required, but there seems to be an odd one out");

    for (int i = 0; i < args.length; i += 2) {
        int a = (Integer) args[i];
        String b = (String) args[i + 1];

        System.out.printf("%d: %s\n", a, b);
    }
}

example(1, "Hello", 2, "Goodbye", 25, "Raptors will eat you!");然后将产生以下输出:

1: Hello
2: Goodbye
25: Raptors will eat you!
于 2013-07-29T00:41:57.690 回答