关于泛型的一点应用(数值类型间的转换)

原创 2016年06月02日 09:12:49

    private static Map<Class<? extends Number>, Constructor> constructorMap = Maps.newHashMap();
    static {
        // Integer Long Short Byte Double Float BigDecimal cache constructor method
        try {
            constructorMap.put(Integer.class, Integer.class.getConstructor(String.class));
            constructorMap.put(Long.class, Long.class.getConstructor(String.class));
            constructorMap.put(Short.class, Short.class.getConstructor(String.class));
            constructorMap.put(Byte.class, Byte.class.getConstructor(String.class));
            constructorMap.put(Double.class, Double.class.getConstructor(String.class));
            constructorMap.put(Float.class, Float.class.getConstructor(String.class));
            constructorMap.put(BigDecimal.class, BigDecimal.class.getConstructor(String.class));
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

缓存常用数值类型 的反射方法  (频繁利用反射查找类内容 会影响性能)





    /**
     * 将未知number对象转换到具体类
     * @param source 源对象
     * @param targetClass 目标类
     * @param <T>
     * @param <E>
     * @return
     */
    public static <T, E extends Number> E number2Target(T source, Class<E> targetClass) {
        if (targetClass.isPrimitive()) {
            throw new RuntimeException("targetClass should not be a basic type!");
        }
        try {
            Constructor<E> constructor = constructorMap.get(targetClass);
            if (source == null) return constructor.newInstance("0");
            if (!(source instanceof Number)) {
                throw new RuntimeException("source should be a number!");
            }
            String number = source.toString();
            if (number.contains(".") && (targetClass.equals(Integer.class)
                    || targetClass.equals(Short.class) || targetClass.equals(Long.class)
                    || targetClass.equals(Byte.class))) {
                return constructor.newInstance(number.substring(0, number.indexOf(".")));
            }
            return constructor.newInstance(number);
        } catch (InstantiationException e) {
            throw new ApolloRuntimeException("targetClass is no such constructor: TargetClass(String s)");
        } catch (IllegalAccessException e) {
            throw new ApolloRuntimeException("The constructor of targetClass is private, no permissions to access");
        } catch (InvocationTargetException e) {
            throw new ApolloRuntimeException("The constructor is error in processing");
        }
    }

利用泛型 跟反射 转换未知的number对象 为目标number对象 由于利用到了构造方法 so 基础类型无法使用

(欢迎大家指正 改造。。)

Efficient C#:为什么要把泛型作为返回值

最近做一题关于泛型返回值的题,结果发现: 1:很多人做错误了; 2:很多人疑问,泛型作为返回值有什么意义;   题目如下: “编写一个函数,要求输入的参数和输出的结果都是泛型。”  (PS...
  • luminji
  • luminji
  • 2013年11月27日 14:00
  • 1743

Java泛型让声明方法返回子类型

泛型典型的使用场景是集合。考虑到大多数情况下集合是同质的(同一类型),通过声明参数类型,可免去类型转换的麻烦。本文将讨论本人阅读Spring Security源码时遇到的一个关于泛型递归模式的问题。 ...
  • jdsjlzx
  • jdsjlzx
  • 2016年06月05日 18:52
  • 7946

JAVA泛型-类型擦除太恶心,但项目中大量使用,以及类型擦除引起的问题及解决方法

泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void ma...
  • mack415858775
  • mack415858775
  • 2015年08月21日 10:16
  • 6239

java泛型方法实现数值类型加法

1.实现数值类型加法实际开发中,经常有数值类型求和的需求,例如实现int类型的加法: public int add(int num1, int num2) { return nu...
  • bitcarmanlee
  • bitcarmanlee
  • 2017年12月06日 18:24
  • 89

Java源代码带两个类型参数的泛型的应用.rar

  • 2013年10月31日 13:45
  • 8KB
  • 下载

黑马程序员_Java基础_泛型应用 和 基本数据类型对象包装类

------- http://www.itheima.com" target="blank">android培训、http://www.itheima.com " target="blank">ja...
  • u012956156
  • u012956156
  • 2015年05月03日 19:39
  • 309

6.数值型类型转换

在swift中,我们定义整型的变量或者常量,在正常情况下只能用int,在特殊的情况下,可能要定义一些特殊类型,如UInt,我们在给这样的一个类型赋值的时候不能超过这个类型的范围 //let a: UI...
  • nvlangxin
  • nvlangxin
  • 2016年01月23日 23:50
  • 146

Java中不同数值类型间转换与计算精度丢失问题

在Java编程过程中,经常会涉及到不同数值类型之间的转换以及计算精度丢失的问题,例如:int m=6; float n=3.5f; double p=2.75d; System.out.pri...
  • gulingfengze
  • gulingfengze
  • 2017年01月05日 16:06
  • 3146

自定义泛型方法及其应用和类型参数的类型推断

自定义泛型方法用其应用1. 定义泛型方法    a. java的泛型方法没有C++函数功能强大,java中的如下代码无法通过编译:    T add(T x, T y) {       return...
  • liguohao00
  • liguohao00
  • 2011年06月17日 19:36
  • 2752

java泛型、原始类型、桥接方法

  • 2014年09月16日 14:04
  • 53KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于泛型的一点应用(数值类型间的转换)
举报原因:
原因补充:

(最多只允许输入30个字)