3

Java で、オブジェクトを入力として受け取り、そのオブジェクトをパラメーターとして指定された型に変換する関数を実装することは可能でしょうか?

プリミティブ データ型の汎用型変換関数を実装しようとしていますが、どこから始めればよいか正確にはわかりません。

public static Object convertPrimitiveTypes(Object objectToConvert, String typeToConvertTo){
    //Given an object that is a member of a primitive type, convert the object to TypeToConvertTo, and return the converted object
}

For example, convertPrimitiveTypes(true, "String")would return the string "true", and convertPrimitiveTypes("10", "int")would return the integer 10. 変換が明確に定義されていない場合 (ブール値から整数への変換など)、メソッドは例外をスローしてプログラムを終了する必要があります。

4

1 に答える 1

8

私はこれを次のように書きました

public static <T> T convertTo(Object o, Class<T> tClass) {

退屈な場合は可能です。効率を気にしない場合は、文字列に変換して、リフレクションを介して "Class".valueOf(String) を使用できます。

public static void main(String... ignore) {
    int i = convertTo("10", int.class);
    String s = convertTo(true, String.class);
    BigDecimal bd = convertTo(1.2345, BigDecimal.class);
    System.out.println("i=" + i + ", s=" + s + ", bd=" + bd);
}

private static final Map<Class, Class> WRAPPER_MAP = new LinkedHashMap<Class, Class>();

static {
    WRAPPER_MAP.put(boolean.class, Boolean.class);
    WRAPPER_MAP.put(byte.class, Byte.class);
    WRAPPER_MAP.put(char.class, Character.class);
    WRAPPER_MAP.put(short.class, Short.class);
    WRAPPER_MAP.put(int.class, Integer.class);
    WRAPPER_MAP.put(float.class, Float.class);
    WRAPPER_MAP.put(long.class, Long.class);
    WRAPPER_MAP.put(double.class, Double.class);
}

public static <T> T convertTo(Object o, Class<T> tClass) {
    if (o == null) return null;
    String str = o.toString();
    if (tClass == String.class) return (T) str;
    Class wClass = WRAPPER_MAP.get(tClass);
    if (wClass == null) wClass = tClass;
    try {
        try {
            return (T) wClass.getMethod("valueOf", String.class).invoke(null, str);
        } catch (NoSuchMethodException e) {
            return (T) wClass.getConstructor(String.class).newInstance(str);
        }
    } catch (Exception e) {
        throw new AssertionError(e);
    }
}

版画

i=10, s=true, bd=1.2345
于 2013-05-12T20:58:37.910 に答える