1. ホーム
  2. java

[解決済み] Javaスプレッド演算子

2022-03-11 18:58:13

質問

ここで使っている語彙がよくわからないのですが、間違っていたらご指摘ください。

Javascriptでは、以下のようなコードになっていました。

let args = [1,2,3];

function doSomething (a, b, c) {
    return a + b + c;
}

doSomething(...args);

ご覧のように doSomething を使用することができるようになりました。 ... スプレッド演算子を使って、引数を 1, 2, 3 .

さて、同じことをJavaでやってみる。

例えば、私が Foo クラスがあります。

public class Foo {
    public int doSomething (int a, int b, int c) {
        return a + b + c;
    }
}

そして、今度は doSomething :

int[] args = {1, 2, 3};

のようなものを使いたい。 doSomething (...args) を呼び出すのではなく doSomething(args[0], args[1], args[2]) .

関数の宣言で可能なのはわかりましたが、このような関数の実装は変更しないようにしたいのですが。

どのように解決するのですか?

Java言語にはこれを行う演算子はありませんが、Javaのクラスライブラリには必要な機能を備えています。

<ブロッククオート

[OPのコメントより] Fooの開発者は、関数doSomethingが取る引数の数を自分で選ぶことができる。そうすれば、引数のバッグを作成し、メソッドに注入することができます。

使用方法 リフレクションAPI ということです。これは、引数を配列でパッケージ化する必要があります。個々のメソッド引数のラッピング/アンラッピングやメソッドの結果など、多くの余分な作業が必要ですが、実行時に署名を確認し、配列を構築し、メソッドを呼び出すことが可能です。

class Test {
    public static int doSomething(int a, int b, int c) {
        return a + b + c;
    }
    // This variable holds method reference to doSomething
    private static Method doSomethingMethod;
    // We initialize this variable in a static initialization block
    static {
        try {
            doSomethingMethod = Test.class.getMethod("doSomething", Integer.TYPE, Integer.TYPE, Integer.TYPE);
        } catch (Exception e) {
        }
    }
    public static void main (String[] ignore) throws java.lang.Exception {
        // Note that args is Object[], not int[]
        Object[] args = new Object[] {1, 2, 3};
        // Result is also Object, not int
        Object res = doSomethingMethod.invoke(null, args);
        System.out.println(res);
    }
}

上記のコードは6を印刷する( デモ ).