4

Varargsについて、グループ内で引数を繰り返すことはできますか?

たとえば、ユーザーが通過できるようにしたい:

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

無理そうです。しかし、docsで述べたように、古い実装では、varargs は実際には配列です。varargs が発明される前に、人々はどのように行動していたのか知​​りたいです。それは、上記のシナリオを達成する方法を教えてくれるかもしれません。結局のところ、私のシナリオは繰り返されていると見なすことができます。{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

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

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 に答える