[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends] Re:ラッパークラスの配列からプリミティブの配列へのコピー
In article <199901060841.RAA01161@xxxxxxxxxx>
ENDO Yasuyuki wrote:
>結局こんなユーティリティー・クラスを書こうと思います。
>
>package jp.co.timedia.util;
>
>public class Arrays {
> pulic static final int[] IntegersToIntArray(Integer[] integers) {
> int[] intarray = null;
> if (integers != null) {
> intarray = new int[integers.length];
> for (int i=0; i<interegs.length; i++) {
> intarray[i] = integers[i].intValue();
> }
> }
> return intarray;
> }
>
> public static final double[] DoublesToDoubleArray(Double[] doubles) {
> // 以下同文...
> }
>}
これってC++のTemplateを使いたい典型的なパターンですよね.
こんなのでどうですか?
# 例外は正しく処理 or throwしましょう>自分
import java.lang.reflect.Array;
import java.lang.reflect.Method;
:
:
public static final Object WrapperArrayToPrimitiveArray(
Object[] from, Class primitiveClass)
throws Exception {
String toTypeName = primitiveClass.toString();
// primitive配列にPutするメソッドね
String setValueMethodName =
"set" + toTypeName.substring(0, 1).toUpperCase() +
toTypeName.substring(1);
Method setValueMethod = Array.class.getMethod(
setValueMethodName,
new Class[]{
Object.class,
int.class,
primitiveClass
});
// PrimitiveType配列の生成
Object to = Array.newInstance(primitiveClass, from.length);
for (int i = 0; i < from.length; i++) {
setValueMethod.invoke(
from[i],
new Object[]{to, new Integer(i), from[i]});
}
return to;
}
呼び出し元にキャストが必要になってしまうのが難点ですが、以下のように
使えます.
double[] d = (double[])WrapperArrayToPrimitiveArray(
wrapperDoubleArray, double.class);
まあ冗談なプログラムなんですけど...
# こうしちゃうとやっぱり動的にしか型チェックできないのは辛い.
# それ以前に遅くて使えない可能性もありますが.
# さらにはすべてのプリミティブでいけるか確認していません(多分OK)
=====================================
Shin@イデア
=====================================