簡體   English   中英

Java - 從字符串轉換為泛型類型

[英]Java - Converting from string to generic type

在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等,而是傳遞值,將其存儲為字符串,然后將其轉換回來。

我相信這是不可能的,因為Java的泛型和整個類型擦除問題的實現,因為它不知道TConvertible在運行時是什么。

試試我的新課

    /*
 * 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM