Java中的基本数据类型转换

如果想要做ORM,将数据映射为对象,则基本的数据类型转换是必要的功能,而Java似乎未提供该功能,只有自己下手来完成该功能.

完成该功能的目标如下:

1: 提供基本的数据转换

2: 考虑转换的性能.

下面是我的具体实现:

1: 接口:

public static <T> T Cast(Class<T> t, Object value)

2: 依赖:需要依赖与获得数据默认值,因为在很多情况下,如果要转换的数据为null,调用者期望的是返回默认值.

系统自动提供的默认值不能满足我们的需求,例如int的默认值为0,但是在sql查询中,如果查询失败,我们期望的是小于0的值,例如Select Count(1) from table1这样的操作.

3: 实现:

/**
     * 类型转换
     * @param t
     * @param value
     * @return
     */
    @SuppressWarnings("unchecked")
	public static <T> T Cast(Class<T> t, Object value) {
    	if (value == null) {
    		return GetDefault(t);
    	}
		if (t == Object.class) {
			return (T)value;
		}

		try
		{
			return Cast_i(t, value);
		} catch(Exception ex) {
			ex.printStackTrace();
    		return GetDefault(t);
		}
    }

  

    private static String GetStr(Class<?> t, Object value) {
    	if (value == null) {
    		return "";
    	}
    	if (t == String.class){
			return (String)value;
		}else {
			return value.toString();
		}
    }

  

	@SuppressWarnings("unchecked")
	private static <T> T Cast_i(Class<T> t, Object value) {
    	Class<?> objClass = value.getClass();
		if (t == String.class) {
			return (T)GetStr(objClass, value);
		}
		if (t == int.class) {
			if (objClass == int.class) {
				return (T)value;
			}
			String text = GetStr(objClass, value);
			Object ret = Integer.parseInt(text);
			return (T)ret;
		}
		if (t == Integer.class) {
			if (objClass == Integer.class) {
				return (T)value;
			}
			if (objClass == int.class) {
				return (T)value;
			}
			String text = GetStr(objClass, value);
			Object ret = Integer.parseInt(text);
			return (T)ret;
		}
		if (t == short.class) {
			if (objClass == int.class) {
				return (T)value;
			}
			String text = GetStr(objClass, value);
			Object ret = Short.parseShort(text);
			return (T)ret;
		}
		if (t == boolean.class || t == Boolean.class) {
			if (objClass == int.class) {
				Object ret = (int)value >= 1? true:false;
				return (T)ret;
			}
			if (objClass == Integer.class) {
				Object ret = (Integer)value >= 1? true:false;
				return (T)ret;
			}
			String text = GetStr(objClass, value);
			Object ret = Integer.parseInt(text);
			ret = (int)ret >= 1? true:false;
			return (T)ret;
		}
		if (t == long.class) {
			if (objClass == long.class) {
				return (T)value;
			}
			String text = GetStr(objClass, value);
			Object ret = Long.parseLong(text);
			return (T)ret;
		}
		if (t == byte.class) {
			if (objClass == byte.class) {
				return (T)value;
			}
			String text = GetStr(objClass, value);
			Object ret = Byte.parseByte(text);
			return (T)ret;
		}
		if (t == double.class) {
			if (objClass == double.class) {
				return (T)value;
			}
			String text = GetStr(objClass, value);
			Object ret = Double.parseDouble(text);
			return (T)ret;
		}
		if (t == float.class) {
			if (objClass == float.class) {
				return (T)value;
			}
			String text = GetStr(objClass, value);
			Object ret = Float.parseFloat(text);
			return (T)ret;
		}
		if (t == BigDecimal.class) {
			if (objClass == BigDecimal.class) {
				return (T)value;
			}
			String text = GetStr(objClass, value);
			return (T)new BigDecimal(text);
		}

		if (t == java.util.Date.class){
			if (objClass == java.util.Date.class) {
				return (T)value;
			}
			String text = GetStr(objClass, value);
			return (T)HiTypeHelper.Convert2Date(text);
		}

		if (t == java.sql.Date.class){
			if (objClass == java.sql.Date.class) {
				return (T)value;
			}
			String text = GetStr(objClass, value);
			return (T)HiTypeHelper.Convert2SqlDate(text);
		}
		if (t == Time.class) {
			if (objClass == Time.class) {
				return (T)value;
			}
			String text = GetStr(objClass, value);
			Object ret = HiTypeHelper.Convert2Date(text).getTime();
			return (T)ret;
		}
		if (t == Timestamp.class) {
			if (objClass == Timestamp.class) {
				return (T)value;
			}
			String text = GetStr(objClass, value);
			return (T)Timestamp.valueOf(text);
		}
		return (T)value;
	}

  

3: 测试代码:

	@Test
	public void Test_HiTypeHelper_Cast() {
		Integer val = 1;
		int ret = HiTypeHelper.Cast(int.class, val);
		Assert.assertEquals(ret, 1);
		String text = "1";
		ret = HiTypeHelper.Cast(int.class, text);
		Assert.assertEquals(ret, 1);
		text = "a";
		ret = HiTypeHelper.Cast(int.class, text);
		Assert.assertEquals(ret, -1);
		int val2 = 1;
		Integer ret2 = HiTypeHelper.Cast(Integer.class, val2);
		Assert.assertEquals(ret2.intValue(), 1);
		text = "1";
		ret2 = HiTypeHelper.Cast(Integer.class, text);
		Assert.assertEquals(ret2.intValue(), 1);
		boolean bl = HiTypeHelper.Cast(boolean.class, 1);
		Assert.assertTrue(bl);
		bl = HiTypeHelper.Cast(boolean.class, 3);
		Assert.assertTrue(bl);
		bl = HiTypeHelper.Cast(boolean.class, 0);
		Assert.assertFalse(bl);
		bl = HiTypeHelper.Cast(boolean.class, -1);
		Assert.assertFalse(bl);
		bl = HiTypeHelper.Cast(boolean.class, "1");
		Assert.assertTrue(bl);
		bl = HiTypeHelper.Cast(boolean.class, "3");
		Assert.assertTrue(bl);
		bl = HiTypeHelper.Cast(boolean.class, "0");
		Assert.assertFalse(bl);
		bl = HiTypeHelper.Cast(boolean.class, "-1");
		Assert.assertFalse(bl);
	}

  

很多时候,数据转换在与数据库交互时使用较多,所以需要提供一些数据库类型的转换,主要是指时间或日期的转换.如:java.util.Date,java.sql.date与String和long之间的转换,下面是我的实现:

    /**
     * 字符串转换成日期
     * @param text
     * @return
     */
    public static java.util.Date Convert2Date(String text) {
    	if (text == null || text.trim() == "") {
    		return null;
    	}
		String format = "yyyy-MM-dd";
		String str = text.trim();
		if (str.contains(":")) {
			format = "yyyy-MM-dd HH:mm:ss";
		}
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		try {
			return sdf.parse(str);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
    }

    /**
     * 字符串转换为日期
     * @param text
     * @return
     */
    public static java.sql.Date Convert2SqlDate(String text) {
		java.util.Date dt = Convert2Date(text);
		return new java.sql.Date(dt.getTime());
    }

    /**
     * 日期转换为字符串
     * @param date
     * @return
     */
    public static String ToShortString(java.util.Date date) {
    	if (date == null) {
    		return null;
    	}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		return sdf.format(date);
    }

    /**
     * 日期转换为字符串
     * @param date
     * @return
     */
    public static String ToLongString(java.util.Date date) {
    	if (date == null) {
    		return null;
    	}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sdf.format(date);
    }
    /**
     * 日期转换为字符串
     * @param date
     * @return
     */
    public static String ToShortString(java.sql.Date date) {
    	if (date == null) {
    		return null;
    	}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		return sdf.format(date);
    }

    /**
     * 日期转换为字符串
     * @param date
     * @return
     */
    public static String ToLongString(java.sql.Date date) {
    	if (date == null) {
    		return null;
    	}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sdf.format(date);
    }

  

时间: 2024-10-07 04:11:17

Java中的基本数据类型转换的相关文章

关于Java中的基本数据类型转换

Java中的基本类型有四种,其中整型分为byte.short.int.long,浮点型分为float.double,字符型char,布尔型boolean.8种类型的级别由低到高byte->short/char->int->long->float->double. Java中的基本数据类型转换分为隐式类型转换(自动类型转换)和显式类型转换(强制类型转换). 隐式类型转换是将一个较低级别的值或变量赋给一个较高级别的变量,在这种情况下,Java会自动地将较低级别的变量或值转换成与较

JavaSE基础(十)--Java中的基本数据类型转换

说基本数据类型转换之前,先了解下 Java 中的 8 种基本数据类型,以及它们的占内存的容量大小和表示的范围,如下图所示. 重新温故了下原始数据类型,现在来解释下它们之间的转换关系. 自动类型转换 自动类型转换是指:数字表示范围小的数据类型可以自动转换成范围大的数据类型. 如: long l = 100; int i = 200; long ll = i; 具体自动转换如如下图所示. 实线表示自动转换时不会造成数据丢失,虚线则可能会出现数据丢失问题. 自动转换也要小心数据溢出问题,看下面的例子.

Java中的基本类型转换,数据溢出原理

java中的数据类型 java是一种强类型语言,在java中,数据类型主要有两大类,基本数据类型和引用数据类型,不同的数据类型有不同的数据存储方式和分配的内存大小. 基本数据类型中,各数据类型所表示的范围也是不一样的,如下所示: 由于在java中,整数默认是采用int型,浮点数默认采用的是double型进行存储,所以在定义long型和float型数据时,必须在数值后面加'l','L'和'f','F',如: 1 long a = 1000l; 2 long b = 2000L; 3 float c

Java中负数以及类型转换问题

学习过java的都知道,在java中,不是直观的表示负数,而是采用补码的形式表示负数. 这是为了硬件操作的方便,把减法也转换成加法来运算. 那补码是怎样表示的呢?为了得到补码,我们引入了反码. 对于正数来讲,它的反码补码都为本身,如果不明白为什么,我们可以这样理解:引入反码补码的原因就是为了解决减法的问题,换句话数就是解决java中负数的问题,正数不存在这些问题,所以它的反码补码就是它本身.在有符号的基本数据类型中,最高位0表示正数,最高位1表示负数. 对于负数来讲,它的反码就是除去符号位取反,

慕课网-安卓工程师初养成-2-9 Java中的自动类型转换

来源:http://www.imooc.com/code/1236 在 Java 程序中,不同的基本数据类型的数据之间经常需要进行相互转换.例如: , 代码中 int 型变量 score1 可以直接为 double 型变量 score2 完成赋值操作,运行结果为: 这种转换称为自动类型转换. 当然自动类型转换是需要满足特定的条件的: 1.  目标类型能与源类型兼容,如 double 型兼容 int 型,但是 char 型不能兼容 int 型 2.  目标类型大于源类型,如 double 类型长度

Java中的自动类型转换

Java里所有的数值型变量可以进行类型转换,这个大家都知道,应该不需要详细解释为什么. 2 在说明自动类型转换之前必须理解这样一个原则“表数范围小的可以向表数范围大的进行自动类型转换” 3 关于java自动类型的转换有这样一个形象的比喻,当一个小的容器的水换到一个大的容器中毫无问题,但是一个大的容器的水换成小的容器则会装不下,就会溢出. 4 下面就是我画出的简要图.

慕课网-安卓工程师初养成-2-10 Java中的强制类型转换

来源:http://www.imooc.com/code/1241 相信小伙伴们也发现了,尽管自动类型转换是很方便的,但并不能满足所有的编程需要. 例如,当程序中需要将 double 型变量的值赋给一个 int 型变量,该如何实现呢? 显然,这种转换是不会自动进行的!因为 int 型的存储范围比 double 型的小.此时就需要通过强制类型转换来实现了. 语法:( 数据类型 ) 数值 运行结果:  可以看到,通过强制类型转换将 75.8 赋值给 int 型变量后,结果为 75,数值上并未进行四舍

Java中的强制类型转换

例如,当程序中需要将 double 型变量的值赋给一个 int 型变量,该如何实现呢? 显然,这种转换是不会自动进行的!因为 int 型的存储范围比 double 型的小.此时就需要通过强制类型转换来实现了. public class HelloWorld{ public static void main(String[] args) { double heightAvg1=176.2; int heightAvg2=(int)heightAvg1; System.out.println(hei

java中常用的类型转换

1.将字符串转换成整数(String--->int)方法一: (1)  int i = Integer.parseInt(String s);  其中(1)其实就是我们经常用到的将s转换为10进制得数,其实默认是调用了 int i =Integer.parseInt("123",10); (2)  i = Integer.parseInt(String s,int radix); radix的范围是在2~36之间,超出范围会抛异常.其中s的长度也不能超出7,否则也会抛异常. 方法