Java - 从字符串转换为泛型类型

时间:2011-02-18 16:24:57

标签: java generics type-conversion

在C#中,我可以做这样的事情

public static TConvertible ChangeType<TConvertible>(object value) where TConvertible : IConvertible
    {
        try
        {
            if (value == null)
                return default(TConvertible);

            return (TConvertible)Convert.ChangeType(value, typeof(TConvertible));
        }
        catch (System.FormatException)
        {
            return default(TConvertible);
        }
    }

有没有办法在java中做类似的事情?我正在使用android SharedPreferences并试图围绕它包装一个管理类。我不想使用getStringgetIntgetLong等,而是传递值,将其存储为字符串,然后将其转换回来。< / p>

2 个答案:

答案 0 :(得分:4)

我认为这是不可能的,因为Java实现了泛型和整个类型擦除问题,因为它不知道TConvertible在运行时是什么。

答案 1 :(得分:1)

尝试我的新班级

    /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sk.freeit.utils;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 *
 * @author radenko
 * radovan.kadlic@gmail.com
 */
public class Convert {
    protected static Object invokeMethod(Object obj, String valMethod) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Method intValue = obj.getClass().getMethod(valMethod);
        return intValue.invoke(obj);
    }

    protected static Object makeNew(Class type, Object obj) throws NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Constructor constructor = type.getConstructor(obj.getClass());
        return constructor.newInstance(obj);
    }

    public static boolean booleanValue(String str) {
        str = str.toLowerCase();
        return !str.isEmpty() && !str.equals("0") && !str.equals("no") && !str.equals("n") && !str.equals("false");
    }

    public static boolean booleanValue(Object obj) {
        Class srcType = obj.getClass();

        if (srcType.equals(boolean.class)||srcType.equals(Boolean.class))
            return (Boolean)obj;
        else if (srcType.equals(byte.class) || srcType.equals(Byte.class))
            return ((Byte)obj)!=0;
        else if (srcType.equals(char.class) || srcType.equals(Character.class))
            return ((Character)obj)!='\0';
        else if (srcType.equals(double.class) || srcType.equals(Double.class))
            return ((Double)obj)!=0.0;
        else if (srcType.equals(float.class) || srcType.equals(Float.class))
            return ((Float)obj)!=0.0;
        else if (srcType.equals(int.class) || srcType.equals(Integer.class))
            return ((Integer)obj)!=0.0;
        else if (srcType.equals(long.class) || srcType.equals(Long.class))
            return ((Long)obj)!=0L;
        else if (srcType.equals(short.class) || srcType.equals(Short.class))
            return ((Short)obj)!=0;
        else if(srcType.equals(String.class))
            return booleanValue(obj.toString());           
        else {
            try {
                return (Boolean)invokeMethod(obj, "booleanValue");
            } catch (NoSuchMethodException ex) {
            } catch (IllegalAccessException ex) {
            } catch (IllegalArgumentException ex) {
            } catch (InvocationTargetException ex) {
            }
        }

        return booleanValue(obj.toString());
    }

    public static byte byteValue(Object obj) {
        Class srcType = obj.getClass();
        if (srcType.equals(boolean.class)||srcType.equals(Boolean.class))
            return ((Boolean)obj)?(byte)1:(byte)0;
        else if (srcType.equals(byte.class) || srcType.equals(Byte.class))
            return ((Byte)obj);
        else if (srcType.equals(char.class) || srcType.equals(Character.class))
            return (byte)Character.getNumericValue((Character)obj);
        else if (srcType.equals(double.class) || srcType.equals(Double.class))
            return ((Double)obj).byteValue();
        else if (srcType.equals(float.class) || srcType.equals(Float.class))
            return ((Float)obj).byteValue();
        else if (srcType.equals(int.class) || srcType.equals(Integer.class))
            return ((Integer)obj).byteValue();
        else if (srcType.equals(long.class) || srcType.equals(Long.class))
            return ((Long)obj).byteValue();
        else if (srcType.equals(short.class) || srcType.equals(Short.class))
            return ((Short)obj).byteValue();
        else if(srcType.equals(String.class))
            return Byte.parseByte((String)obj);
        else {
            try {
                return (Byte)invokeMethod(obj,"byteValue");
            } catch (NoSuchMethodException ex) {
            } catch (IllegalAccessException ex) {
            } catch (IllegalArgumentException ex) {
            } catch (InvocationTargetException ex) {
            }
        }           

        return Byte.parseByte(obj.toString());
    }

    public static char charValue(Object obj) {
        Class srcType = obj.getClass();

        if (srcType.equals(boolean.class)||srcType.equals(Boolean.class))
            return ((Boolean)obj)?'\0':'Y';
        else if (srcType.equals(byte.class) || srcType.equals(Byte.class))
            return Character.forDigit((Byte)obj,10);
        else if (srcType.equals(char.class) || srcType.equals(Character.class))
            return (Character)obj;
        else if (srcType.equals(double.class) || srcType.equals(Double.class))
            return Character.forDigit(((Double)obj).intValue(),10);
        else if (srcType.equals(float.class) || srcType.equals(Float.class))
            return Character.forDigit(((Float)obj).intValue(),10);
        else if (srcType.equals(int.class) || srcType.equals(Integer.class))
            return Character.forDigit((Integer)obj,10);
        else if (srcType.equals(long.class) || srcType.equals(Long.class))
            return Character.forDigit(((Long)obj).intValue(),10);
        else if (srcType.equals(short.class) || srcType.equals(Short.class))
            return Character.forDigit((Short)obj,10);
        else if(srcType.equals(String.class))
            return ((String)obj).charAt(0);
        else {
            try {
                return (Character)invokeMethod(obj, "charValue");
            } catch (NoSuchMethodException ex) {
            } catch (IllegalAccessException ex) {
            } catch (IllegalArgumentException ex) {
            } catch (InvocationTargetException ex) {
            }
        }           

        return obj.toString().charAt(0);
    }

    public static double doubleValue(Object obj) {
        Class srcType = obj.getClass();
        if (srcType.equals(boolean.class)||srcType.equals(Boolean.class))
            return ((Boolean)obj)?1.0:0.0;
        else if (srcType.equals(byte.class) || srcType.equals(Byte.class))
            return ((Byte)obj).doubleValue();
        else if (srcType.equals(char.class) || srcType.equals(Character.class))
            return Character.getNumericValue((Character)obj);
        else if (srcType.equals(double.class) || srcType.equals(Double.class))
            return ((Double)obj).doubleValue();
        else if (srcType.equals(float.class) || srcType.equals(Float.class))
            return ((Float)obj).doubleValue();
        else if (srcType.equals(int.class) || srcType.equals(Integer.class))
            return ((Integer)obj).doubleValue();
        else if (srcType.equals(long.class) || srcType.equals(Long.class))
            return ((Long)obj).doubleValue();
        else if (srcType.equals(short.class) || srcType.equals(Short.class))
            return ((Short)obj).doubleValue();
        else if(srcType.equals(String.class))
            return Double.parseDouble((String)obj);
        else {
            try {
                return (Double)invokeMethod(obj, "doubleValue");
            } catch (NoSuchMethodException ex) {
            } catch (IllegalAccessException ex) {
            } catch (IllegalArgumentException ex) {
            } catch (InvocationTargetException ex) {
            }
        }       

        return Double.parseDouble(obj.toString());
    }

    public static float floatValue(Object obj) {
        Class srcType = obj.getClass();

        if (srcType.equals(boolean.class)||srcType.equals(Boolean.class))
            return ((Boolean)obj)?1.0f:0.0f;
        else if (srcType.equals(byte.class) || srcType.equals(Byte.class))
            return ((Byte)obj);
        else if (srcType.equals(char.class) || srcType.equals(Character.class))
            return Character.getNumericValue((Character)obj);
        else if (srcType.equals(double.class) || srcType.equals(Double.class))
            return ((Double)obj).floatValue();
        else if (srcType.equals(float.class) || srcType.equals(Float.class))
            return ((Float)obj);
        else if (srcType.equals(int.class) || srcType.equals(Integer.class))
            return ((Integer)obj).floatValue();
        else if (srcType.equals(long.class) || srcType.equals(Long.class))
            return ((Long)obj);
        else if (srcType.equals(short.class) || srcType.equals(Short.class))
            return ((Short)obj);
        else if(srcType.equals(String.class))
            return Float.parseFloat((String)obj);
        else {
            try {
                return (Float)invokeMethod(obj, "floatValue");
            } catch (NoSuchMethodException ex) {
            } catch (IllegalAccessException ex) {
            } catch (IllegalArgumentException ex) {
            } catch (InvocationTargetException ex) {
            }
        }

        return Float.parseFloat(obj.toString());
    }

    public static int intValue(Object obj) {
        Class srcType = obj.getClass();

        if (srcType.equals(boolean.class)||srcType.equals(Boolean.class))
            return ((Boolean)obj)?1:0;
        else if (srcType.equals(byte.class) || srcType.equals(Byte.class))
            return ((Byte)obj).intValue();
        else if (srcType.equals(char.class) || srcType.equals(Character.class)) {
            return Character.getNumericValue((Character)obj);
        }
        else if (srcType.equals(double.class) || srcType.equals(Double.class))
            return ((Double)obj).intValue();
        else if (srcType.equals(float.class) || srcType.equals(Float.class))
            return ((Float)obj).intValue();
        else if (srcType.equals(int.class) || srcType.equals(Integer.class))
            return ((Integer)obj).intValue();
        else if (srcType.equals(long.class) || srcType.equals(Long.class))
            return ((Long)obj).intValue();
        else if (srcType.equals(short.class) || srcType.equals(Short.class))
            return ((Short)obj).intValue();
        else if(srcType.equals(String.class))
            return Integer.parseInt((String)obj);
        else {
            try {
                return (Integer)invokeMethod(obj, "intValue");
            } catch (NoSuchMethodException ex) {
            } catch (IllegalAccessException ex) {
            } catch (IllegalArgumentException ex) {
            } catch (InvocationTargetException ex) {
            }
        }    

        return Integer.parseInt(obj.toString());
    }

    public static long longValue(Object obj) {
        Class srcType = obj.getClass();

        if (srcType.equals(boolean.class)||srcType.equals(Boolean.class))
            return ((Boolean)obj)?1:0;
        else if (srcType.equals(byte.class) || srcType.equals(Byte.class))
            return ((Byte)obj);
        else if (srcType.equals(char.class) || srcType.equals(Character.class))
            return Character.getNumericValue((Character)obj);
        else if (srcType.equals(double.class) || srcType.equals(Double.class))
            return ((Double)obj).longValue();
        else if (srcType.equals(float.class) || srcType.equals(Float.class))
            return ((Float)obj).longValue();
        else if (srcType.equals(int.class) || srcType.equals(Integer.class))
            return ((Integer)obj);
        else if (srcType.equals(long.class) || srcType.equals(Long.class))
            return ((Long)obj);
        else if (srcType.equals(short.class) || srcType.equals(Short.class))
            return ((Short)obj);
        else if(srcType.equals(String.class))
            return Long.parseLong((String)obj);
        else {
            try {
                return (Long)invokeMethod(obj, "longValue");
            } catch (NoSuchMethodException ex) {
            } catch (IllegalAccessException ex) {
            } catch (IllegalArgumentException ex) {
            } catch (InvocationTargetException ex) {
            }
        }       

        return Long.parseLong(obj.toString());
    }

    public static short shortValue(Object obj) {
        Class srcType = obj.getClass();

        if (srcType.equals(boolean.class)||srcType.equals(Boolean.class))
            return ((Boolean)obj)?(short)1:(short)0;
        else if (srcType.equals(byte.class) || srcType.equals(Byte.class))
            return ((Byte)obj).shortValue();
        else if (srcType.equals(char.class) || srcType.equals(Character.class))
            return (short)Character.getNumericValue((Character)obj);
        else if (srcType.equals(double.class) || srcType.equals(Double.class))
            return ((Double)obj).shortValue();
        else if (srcType.equals(float.class) || srcType.equals(Float.class))
            return ((Float)obj).shortValue();
        else if (srcType.equals(int.class) || srcType.equals(Integer.class))
            return ((Integer)obj).shortValue();
        else if (srcType.equals(long.class) || srcType.equals(Long.class))
            return ((Long)obj).shortValue();
        else if (srcType.equals(short.class) || srcType.equals(Short.class))
            return ((Short)obj);
        else if(srcType.equals(String.class))
            return Short.parseShort((String)obj);
        else {
            try {
                return (Short)invokeMethod(obj, "shortValue");
            } catch (NoSuchMethodException ex) {
            } catch (IllegalAccessException ex) {
            } catch (IllegalArgumentException ex) {
            } catch (InvocationTargetException ex) {
            }
        }

        return Short.parseShort(obj.toString());
    }    

    public static Object changeType (Object obj, Class type) {
        if (obj.getClass().equals(type)) return obj;

        if (type.equals(boolean.class)||type.equals(Boolean.class))
            return booleanValue(obj);
        else if (type.equals(byte.class) || type.equals(Byte.class))
            return byteValue(obj);
        else if (type.equals(char.class) || type.equals(Character.class))
            return charValue(obj);
        else if (type.equals(double.class) || type.equals(Double.class))
            return doubleValue(obj);
        else if (type.equals(float.class) || type.equals(Float.class))
            return floatValue(obj);
        else if (type.equals(int.class) || type.equals(Integer.class))
            return intValue(obj);
        else if (type.equals(long.class) || type.equals(Long.class))
            return longValue(obj);
        else if (type.equals(short.class) || type.equals(Short.class))
            return shortValue(obj);
        else if(type.equals(String.class))
            return obj.toString();
        else {
            try {
                invokeMethod(obj,type.getName()+"Value");
            } catch (NoSuchMethodException ex) {
            } catch (IllegalAccessException ex) {
            } catch (IllegalArgumentException ex) {
            } catch (InvocationTargetException ex) {
            }

            try {
                invokeMethod(obj,"to"+type.getName());
            } catch (NoSuchMethodException ex) {
            } catch (IllegalAccessException ex) {
            } catch (IllegalArgumentException ex) {
            } catch (InvocationTargetException ex) {
            }
            try {
                return makeNew(type, obj);
            } catch (NoSuchMethodException ex) {
            } catch (InstantiationException ex) {
            } catch (IllegalAccessException ex) {
            } catch (IllegalArgumentException ex) {
            } catch (InvocationTargetException ex) {
            }            
        }          

        return type.cast(obj);
    } 
}

Radenko

相关问题