14

vargs を受け入れるメソッド呼び出しでオブジェクト配列を別のオブジェクトにアンパックできるかどうかを知りたいです。この質問は、この質問に似ています

私は次のようなコードを持っています:

public class Test {
    public static Object doWork(Object... objects){
        System.out.println(objects.length);
        return objects;
    }

    public static void main(String[] args){
        Object res = doWork("one", "two");
        res = doWork("three", res);
    }
}

2 番目の呼び出しでオブジェクトをアンパックしてres、現在のように長さ 2 ではなく長さ 3 のオブジェクト配列を受け取るようにしたいと思います (2 番目の位置は長さ 2 のオブジェクト配列で、3 つの引数すべてを持ちます)。

Javaでもそれは可能ですか?


より詳細な:

することで

Object res = doWork("one", "two");
res = doWork("three", res);

2 番目の呼び出しは次のように呼び出されます。

doWork( Object[ "three", Object[ "one", "two" ] ] )

私がしたい場所:

doWork(Object[ "one", "two", "three" ] )

私はこれを行うことで達成できることを知っています:

public static void main(String[] args){
res = doWork("one", "two");
    List<Object> los = Arrays.asList(res);
    los = new ArrayList<>(los);     // Can't modify an underlying array
    los.add("three");
    res = doWork(los.toArray());
}

unpackしかし、 Lua の組み込み関数や、前述の SO の質問で説明されている Python の方法のようなものを探しています。


@chancea と @Cyrille-ka の両方の回答は適切で、問題も解決します。考慮すべき良い考えの 1 つは、メソッドのシグネチャを変更できるかどうかです。@ cyrille-ka の回答は関数の署名を尊重しますが、@ chancea は尊重しません。ただし、ほとんどの場合、単純なラッパー関数を別のラッパー関数に書き込むだけでよいので、問題にはならないと思います。一方、@chancea さんのやり方は、プログラミング中に使いやすいかもしれません (unpack 関数を呼び出すのを忘れるという間違いはありません)。

4

3 に答える 3

1

これは解決策を実装するのではなく、コメントで述べたようにUnpack作成することで解決します。overload methodこれがあなたが望んでいたものかどうかはわかりませんが、うまくいきましたので、参考のために投稿したいと思いました.

public class Test {
    public static Object doWork(Object... objects){
        System.out.println(objects.length);
        return objects;
    }

    // this is the method that will concatenate the arrays for you
    public static Object doWork(Object[] objects1, Object... objects2){
        System.out.println(objects1.length + "+" + objects2.length);
        Object[] retval = new Object[objects1.length+objects2.length];
        System.arraycopy(objects1, 0, retval, 0, objects1.length);
        System.arraycopy(objects2, 0, retval, objects1.length, objects2.length);
        return retval;
    }

    public static void main(String[] args){
        Object res = doWork("one", "two");
        res = doWork((Object[])res, "three");
        Object[] res2 = (Object[])res; // = {one, two, three}
    }
}
于 2013-07-24T15:00:41.333 に答える