teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

訂正(恥だー)

2016/09/26 18:37

投稿

退会済みユーザー
answer CHANGED
@@ -40,4 +40,95 @@
40
40
  配列は次元ごとに初期化できるからです。
41
41
 
42
42
  ###誤りの訂正
43
- 指定した次元はすべて初期化されます。上の例では、3, 0 は正しく二次元まで初期化されます。配列の初期化と配列の要素に代入可能なことを混同した説明になっています。できれば、Javaのソースコードを調べて回答します。
43
+ 指定した次元はすべて初期化されます。上の例では、3, 0 は正しく二次元まで初期化されます。配列の初期化と配列の要素に代入可能なことを混同した説明になっています(恥だ)。できれば、Javaのソースコードを調べて回答します。
44
+
45
+ ###訂正
46
+ java.lang.reflect.Array のソースコード(build 1.8.0_92-b14)を確認しました。newInstance()から以下のnativeメソッドを呼びます。nativeメソッドの詳細は不明です。
47
+
48
+ ```Java
49
+ private static native Object newArray(Class<?> componentType, int length)
50
+ throws NegativeArraySizeException;
51
+
52
+ private static native Object multiNewArray(Class<?> componentType, int[] dimensions)
53
+ throws IllegalArgumentException, NegativeArraySizeException;
54
+ ```
55
+
56
+ 配列の中身を確認しました。かっこ悪く力づくでダンプするやり方。
57
+
58
+ ```Java
59
+ static void dump(Object o) {
60
+ System.out.println("---------------");
61
+ dump("",o);
62
+ }
63
+ static void dump(String indent, Object o) {
64
+ if (o == null) {
65
+ System.out.println("null");
66
+ return;
67
+ }
68
+ Class<?> cz = o.getClass();
69
+ if (cz == int[].class) {
70
+ dump(indent + " ", (int[]) o);
71
+ } else if (cz.isArray()) {
72
+ Object[] o1 = (Object[]) o;
73
+ System.out.println(
74
+ "type is " + cz.getTypeName() + " : length = " + o1.length
75
+ );
76
+ for (int i=0; i<o1.length; ++i) {
77
+ System.out.print(indent+" [" + i + "] : ");
78
+ dump((indent+" "), o1[i]);
79
+ }
80
+ } else {
81
+ System.out.print(indent + cz.getTypeName() + " : " + o + " ");
82
+ }
83
+ }
84
+
85
+ static void dump(String indent, int[] o1) {
86
+ System.out.print(
87
+ "type is " + o1.getClass().getTypeName()
88
+ );
89
+ System.out.print(" {");
90
+ for (int i=0; i<o1.length; ++i) {
91
+ System.out.print(((i==0)?"":",") + o1[i]);
92
+ }
93
+ System.out.println("}");
94
+ }
95
+ ```
96
+
97
+ 配列の作成とダンプ。指定した次元はすべて初期化されます。
98
+
99
+ ```Java
100
+ Object o = Array.newInstance(int[].class, new int[]{5, 2});
101
+ dump(o);
102
+
103
+ o = Array.newInstance(int[][].class, new int[]{5});
104
+ dump(o);
105
+ ```
106
+
107
+ 実行結果
108
+
109
+ ---------------
110
+ type is int[][][] : length = 5
111
+ [0] : type is int[][] : length = 2
112
+ [0] : null
113
+ [1] : null
114
+ [1] : type is int[][] : length = 2
115
+ [0] : null
116
+ [1] : null
117
+ [2] : type is int[][] : length = 2
118
+ [0] : null
119
+ [1] : null
120
+ [3] : type is int[][] : length = 2
121
+ [0] : null
122
+ [1] : null
123
+ [4] : type is int[][] : length = 2
124
+ [0] : null
125
+ [1] : null
126
+
127
+ ---------------
128
+ type is int[][][] : length = 5
129
+ [0] : null
130
+ [1] : null
131
+ [2] : null
132
+ [3] : null
133
+ [4] : null
134
+

1

誤りです。

2016/09/26 18:36

投稿

退会済みユーザー
answer CHANGED
@@ -37,4 +37,7 @@
37
37
  }
38
38
  };
39
39
  ```
40
- 配列は次元ごとに初期化できるからです。
40
+ 配列は次元ごとに初期化できるからです。
41
+
42
+ ###誤りの訂正
43
+ 指定した次元はすべて初期化されます。上の例では、3, 0 は正しく二次元まで初期化されます。配列の初期化と配列の要素に代入可能なことを混同した説明になっています。できれば、Javaのソースコードを調べて回答します。