4

質問はここに残されています。人々が回答したためです。私の問題は、使用していた API のバージョンが私が持っていたドキュメントと同期していないことでした....実際にこれを行うことができます。

配列の vararg を期待する引数の引数として Java で 2 次元配列を使用する方法はありますか?

私が呼び出そうとしている関数は

public Long sadd(final byte[] key, final byte[]... members) {

そして、私はバイトの2次元配列を持っています(byte [][] data=blah)

ただし、電話をかけようとすると

sadd(key,data);

次のコンパイラ エラーが発生します。

(実引数 byte[][] はメソッド呼び出し変換で byte[] に変換できません)

配列型の vararg として 2 次元配列を使用する方法はありますか?

4

4 に答える 4

6

以下は私にとってはうまくいきます。もしかしたら、自分が思っていることをしていないのではないですか?

@Test
public void test_varargs() {
   byte[] x = new byte[] { 1, 2, 3};
   byte[] y = new byte[] { 0, 1, 2};
   assertEquals(9L, sum(x,y));
   byte[][] z = new byte[][] { x,y };
   assertEquals(9L, sum(z));
}

public long sum(final byte[]... members) {
   long sum = 0;
   for (byte[] member : members) {
       for (byte x : member) {
         sum += x;
      }
   }
   return sum;
}
于 2012-08-29T10:43:46.813 に答える
2

これは私のためにコンパイルされるので、あなたのコードをもっと提供してもらえますか。

byte[][] data = new byte[1][];
byte[] key = new byte[1];

long sadd = sadd(key, data);
于 2012-08-29T10:18:32.487 に答える
1
class A {
    void show(int[] ax,int[]...arr) {
        for (int is : ax) {
            System.out.println(is);
        }
        for (int[] a : arr) {
            for (int i : a) {
                System.out.println(i);
            }
        }
    }
}
public class abc{
    public static void main(String[] args) {
        A a = new A();
        int[] arr1= new int[]{10,20};
        int[][] arr2 = new int[][] { { 10, 20 }, { 20, 20 }, { 30, 20 } };
        a.show(arr1,arr2);  
    }
}

ここでは、2 次元配列を var args パラメーターとして使用し、1 次元配列を固定パラメーターとして使用しています。これが役立つ場合は、このコードを参照してください。:)

于 2014-07-25T10:23:16.890 に答える
0

コンパイラには 2 つの次元を推測する方法がないため、これは不可能です。1 次元配列を使用する場合、補助引数 (必須ではないもの) の数として配列の長さを決定できます。

例: メソッド定義にn必須パラメーターが含まれており、実行時にmさらに引数を指定するとします。これらのm引数は、補助引数の配列を構成します。長さはmです。2 次元配列の場合、コンパイラは次のような配列の 2 つの次元を考え出す必要がありますdimension1 * dimension2 = m

于 2012-08-29T10:26:13.887 に答える