我们经常会遇到java中类型转换的问题,如父类子类之间的类型转换、基本数据类型之间的转换[int->double,double->float]等等。之所以写这篇文章是因为这几天遇到一段类型转换的代码(错误的,运行时异常):
List<Integer> tempList = new ArrayList<Integer>();
tempList.add(12);
tempList.add(13);
Integer tempInt[] = (Integer[]) tempList.toArray();//obj.toArray() 返回Object[]
异常信息:[Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
看到这里感觉没什么稀奇,我们再看如下代码(运行没有任何错误):
Object objInt = 12;
int aInt =(Integer)objInt;
好吧,我的问题来了:
1.基本类型之间的转换可以正常过进行,引用类型之间却不行,为什么?
2.基本类型之间的转换造成的数据丢失说明什么?
回答第一个问题:
在java中 int tempInt[]={12,12,.. },这是意味着赋值操作,解释的深层次来说就是内存中一个指针指向一块存储了数组的内存地址。
确切的说,Object[] 是不能转化为任何实际类型的数组的,因为对java 来说根类Object 可以是任何类型的父类。在语法检查的层次上,Object强制类型转换为任何其他类型都是通过的。但在运行中,Object 的内存存储是不认得,因为Object 可以是任何类型。如下代码:
Object[] objArr={12,"12",'12'};
Integer tempInt[] = (Integer[])objArr;
回答第二个问题:
先看一段代码:
1.double b=12.56;
2.int a=(int)b;
3.System.out.println(a+"--"+b);
输出:
12--12.56
对于了解java 内部存储机制的人来说这很好理解。第2行代码代表的是赋值操作,即开辟一块内存存储int 类型的a, 值为12。而0.56则被略去。
综述:java 类型转换的实质是由其在内存中的存储结构决定的。