[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@イデア
=====================================