java类的转换工具类,泛型的使用

做项目的时候,要取出map中的值进行运算,map对象如下,不知道什么类型,还要进行准确的转换,确实是不容易,然后写一个可扩展的工具类,方便项目使用,也方便大家使用

Map<String,Object> map = new HashMap<>();

可引入工具类进行补充使用,预留了很多接口,可自行补充使用 

import java.lang.reflect.Array;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Stack;
 
/**
 * @Method:常见对象类型的转换工具类
 */
public class TransitionUtil {
    /**
     * @Method:返回相应类型的值
     * Boolean  Byte    Character   Short    Integer     Long       Float       Double
     * 1        2       3           4       5           6           7           8
     * String   Date    Array       Map      List       BigDecimal  BigInteger  Stack
     * 9        10      11          12      13          14          15          16
     * @param obj 需要判断类型的值
     * @param <T> 返回的类型
     * @return 返回相应的类型转换的对象值
     */
    public static  <T> T transitionType(Object obj, Class<T> t){
        if (obj==null){
            return (T)returnNull(t);
        }
        return (T) transition(obj,Integer.parseInt(getObjectType(obj)+""+getClassType(t)));
    }
 
    private static <T> Object returnNull(Class<T> t) {
        if (t==Boolean.class||t==boolean.class){
            return false;
        }else if (t==Character.class||t==char.class){
            return '0';
        }else if (t==Byte.class||t==byte.class){
            return "0".getBytes()[0];
        }else if (t==Short.class||t==short.class){
            return 0;
        }else if (t==Integer.class||t==int.class){
            return 0;
        }else if (t==Long.class||t==long.class){
            return 0l;
        }else if (t==Float.class||t==float.class){
            return 0f;
        }else if (t==Double.class||t==double.class){
            return 0d;
        }else if (t==Void.class||t==void.class){//这个类型设置为0吧
            return 80;
 
        /*
            非基本类型
            String   Date    Array       Map      List       BigDecimal  BigInteger  Stack
         */
        }
        return null;
    }
 
 
    /**
     * @Method:将指定的对象进行相应的转换
     * @param original 未进行转换的对象
     * @param code  进行转换的代码值
     *   规律: 【下标符号A,B相拼接,代表A转B、  B,A相拼接,代表B转A】
     *  12 代表 Boolean(boolean)转Byte(byte)      13 代表 Boolean(boolean)转Character(char)
     *  14 代表 Boolean(boolean)转Short(short)    15 代表 Boolean(boolean)转Integer(int)
     *  910 代表 String转Date      109 代表 Data转String
     *
     *    boolean   byte    char       short    int         long       float       double
     *    Boolean  Byte    Character   Short    Integer     Long       Float       Double
     *      1        2       3           4       5           6         7           8
     *    String   Date    Array       Map      List       BigDecimal  BigInteger  Stack
     *      9      10      20          30        40         50         60          70
     * @return 返回转换后的目标对象       根据上方的参考码,需要可以自行添加调用
     */
    private static Object transition(Object original, int code){
        //相应的接口,需要可进行补充.....
        switch (code){
            case 15:
                return  (Boolean)original ? 1 : 0;
            case 19:
                return original.toString();
            case 58:
                return Double.parseDouble(original.toString());
            case 85:
                Double db = Double.parseDouble(original.toString());
                return db.intValue();
            case 56:
            case 96:
                return Long.parseLong(original.toString().trim());
            case 508:
                return ((BigDecimal) original).doubleValue();
            default:
                int mid ;
                //剩下的是自己转自己?
                if (code<100){//自己转自己,两位数
                    mid = code/10;
                    code = code-mid*10;
                    if (mid==code){//判断是否相同
                        return original;
                    }
                }else if (code>1000){//自己转自己,四位数
                    mid = code/100;
                    code = code-mid*100;
                    if (mid==code){//判断是否相同
                        return original;
                    }
                }
                throw new RuntimeException("TransitionUtil.transition: No corresponding conversion method is implemented:"+code+"(没有实现相应的转换方法:"+code+")");
        }
    }
    /*
     * @Method:获取Object中的类型
     *    boolean   byte    char       short    int         long       float       double
     *    Boolean  Byte    Character   Short    Integer     Long       Float       Double
     *      1        2       3           4       5           6         7           8
     *    String   Date    Array       Map      List       BigDecimal  BigInteger  Stack
     *      9      10      20          30        40         50         60          70
     *
     * @param obj 要获取参数的类型
     * @return 返回类型的标识
     */
    private static int getObjectType(Object obj){
        if (obj instanceof Boolean){
            return 1;
        }else if (obj instanceof Byte){
            return 2;
        }else if (obj instanceof Character){
            return 3;
        }else if (obj instanceof Short){
           return 4;
        }else if (obj instanceof Integer){
            return 5;
        }else if (obj instanceof Long){
            return 6;
        }else if (obj instanceof Float){
            return 7;
        }else if (obj instanceof Double){
            return 8;
        }else if (obj instanceof String){
            return 9;
        }else if (obj instanceof Date){
            return 10;
        }else if (obj instanceof Array){
            return 20;
        }else if (obj instanceof Map){
            return 30;
        }else if (obj instanceof List){
            return 40;
        }else if (obj instanceof BigDecimal){
            return 50;
        }else if (obj instanceof BigInteger){
            return 60;
        }else if (obj instanceof Stack){
            return 70;
        }else {
            return 0;
        }
    }
 
    /*
     * @Method:获取Object中的类型
     *    boolean   byte    char       short    int         long       float       double
     *    Boolean  Byte    Character   Short    Integer     Long       Float       Double
     *      1        2       3           4       5           6         7           8
     *    String   Date    Array       Map      List       BigDecimal  BigInteger  Stack
     *      9      10      20          30        40         50         60          70
     *    void
     *    Void      待补充
     *     80       10000
     *
     * @param obj 要获取参数的类型
     * @return 返回类型的标识
     */
    private static <T> int getClassType(Class<T> t){
         /*
            首先判断处理基本类型
            Boolean.TYPE, Character.TYPE, Byte.TYPE, Short.TYPE, Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE, Void.TYPE
            ((Class) t.getField("TYPE").get(null)).isPrimitive()
         */
        if (t==Boolean.class||t==boolean.class){
            return 1;
        }else if (t==Character.class||t==char.class){
            return 2;
        }else if (t==Byte.class||t==byte.class){
            return 3;
        }else if (t==Short.class||t==short.class){
            return 4;
        }else if (t==Integer.class||t==int.class){
            return 5;
        }else if (t==Long.class||t==long.class){
            return 6;
        }else if (t==Float.class||t==float.class){
            return 7;
        }else if (t==Double.class||t==double.class){
            return 8;
        }else if (t==Void.class||t==void.class){//这个类型设置为0吧
            return 80;
 
        /*
            非基本类型
            String   Date    Array       Map      List       BigDecimal  BigInteger  Stack
         */
        }else if (t==String.class){
            return 9;
        }else if (t==Date.class){
            return 10;
        }else if (t==Array.class){
            return 20;
        }else if (t==Map.class){
            return 30;
        }else if (t==List.class){
            return 40;
        }else if (t==BigDecimal.class){
            return 50;
        }else if (t==BigInteger.class){
            return 60;
        }else if (t==Stack.class){
            return 70;
        }else {
            return 10000;
        }
    }
}

 原文地址:判断Object对象属性的类型_技匠而已的博客-CSDN博客_判断object是什么类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值