回答編集履歴

2

訂正(恥だー)

2016/09/26 18:37

投稿

退会済みユーザー
test CHANGED
@@ -82,6 +82,188 @@
82
82
 
83
83
  ###誤りの訂正
84
84
 
85
- 指定した次元はすべて初期化されます。上の例では、3, 0 は正しく二次元まで初期化されます。配列の初期化と配列の要素に代入可能なことを混同した説明になっています。できれば、Javaのソースコードを調べて回答します。
85
+ 指定した次元はすべて初期化されます。上の例では、3, 0 は正しく二次元まで初期化されます。配列の初期化と配列の要素に代入可能なことを混同した説明になっています(恥だ)。できれば、Javaのソースコードを調べて回答します。
86
+
87
+
88
+
86
-
89
+ ###訂正
90
+
87
-
91
+ java.lang.reflect.Array のソースコード(build 1.8.0_92-b14)を確認しました。newInstance()から以下のnativeメソッドを呼びます。nativeメソッドの詳細は不明です。
92
+
93
+
94
+
95
+ ```Java
96
+
97
+ private static native Object newArray(Class<?> componentType, int length)
98
+
99
+ throws NegativeArraySizeException;
100
+
101
+
102
+
103
+ private static native Object multiNewArray(Class<?> componentType, int[] dimensions)
104
+
105
+ throws IllegalArgumentException, NegativeArraySizeException;
106
+
107
+ ```
108
+
109
+
110
+
111
+ 配列の中身を確認しました。かっこ悪く力づくでダンプするやり方。
112
+
113
+
114
+
115
+ ```Java
116
+
117
+ static void dump(Object o) {
118
+
119
+ System.out.println("---------------");
120
+
121
+ dump("",o);
122
+
123
+ }
124
+
125
+ static void dump(String indent, Object o) {
126
+
127
+ if (o == null) {
128
+
129
+ System.out.println("null");
130
+
131
+ return;
132
+
133
+ }
134
+
135
+ Class<?> cz = o.getClass();
136
+
137
+ if (cz == int[].class) {
138
+
139
+ dump(indent + " ", (int[]) o);
140
+
141
+ } else if (cz.isArray()) {
142
+
143
+ Object[] o1 = (Object[]) o;
144
+
145
+ System.out.println(
146
+
147
+ "type is " + cz.getTypeName() + " : length = " + o1.length
148
+
149
+ );
150
+
151
+ for (int i=0; i<o1.length; ++i) {
152
+
153
+ System.out.print(indent+" [" + i + "] : ");
154
+
155
+ dump((indent+" "), o1[i]);
156
+
157
+ }
158
+
159
+ } else {
160
+
161
+ System.out.print(indent + cz.getTypeName() + " : " + o + " ");
162
+
163
+ }
164
+
165
+ }
166
+
167
+
168
+
169
+ static void dump(String indent, int[] o1) {
170
+
171
+ System.out.print(
172
+
173
+ "type is " + o1.getClass().getTypeName()
174
+
175
+ );
176
+
177
+ System.out.print(" {");
178
+
179
+ for (int i=0; i<o1.length; ++i) {
180
+
181
+ System.out.print(((i==0)?"":",") + o1[i]);
182
+
183
+ }
184
+
185
+ System.out.println("}");
186
+
187
+ }
188
+
189
+ ```
190
+
191
+
192
+
193
+ 配列の作成とダンプ。指定した次元はすべて初期化されます。
194
+
195
+
196
+
197
+ ```Java
198
+
199
+ Object o = Array.newInstance(int[].class, new int[]{5, 2});
200
+
201
+ dump(o);
202
+
203
+
204
+
205
+ o = Array.newInstance(int[][].class, new int[]{5});
206
+
207
+ dump(o);
208
+
209
+ ```
210
+
211
+
212
+
213
+ 実行結果
214
+
215
+
216
+
217
+ ---------------
218
+
219
+ type is int[][][] : length = 5
220
+
221
+ [0] : type is int[][] : length = 2
222
+
223
+ [0] : null
224
+
225
+ [1] : null
226
+
227
+ [1] : type is int[][] : length = 2
228
+
229
+ [0] : null
230
+
231
+ [1] : null
232
+
233
+ [2] : type is int[][] : length = 2
234
+
235
+ [0] : null
236
+
237
+ [1] : null
238
+
239
+ [3] : type is int[][] : length = 2
240
+
241
+ [0] : null
242
+
243
+ [1] : null
244
+
245
+ [4] : type is int[][] : length = 2
246
+
247
+ [0] : null
248
+
249
+ [1] : null
250
+
251
+
252
+
253
+ ---------------
254
+
255
+ type is int[][][] : length = 5
256
+
257
+ [0] : null
258
+
259
+ [1] : null
260
+
261
+ [2] : null
262
+
263
+ [3] : null
264
+
265
+ [4] : null
266
+
267
+
268
+
269
+

1

誤りです。

2016/09/26 18:36

投稿

退会済みユーザー
test CHANGED
@@ -77,3 +77,11 @@
77
77
  ```
78
78
 
79
79
  配列は次元ごとに初期化できるからです。
80
+
81
+
82
+
83
+ ###誤りの訂正
84
+
85
+ 指定した次元はすべて初期化されます。上の例では、3, 0 は正しく二次元まで初期化されます。配列の初期化と配列の要素に代入可能なことを混同した説明になっています。できれば、Javaのソースコードを調べて回答します。
86
+
87
+