代码如下:
List<String>[] lsa = new List<String>[10]; // Not really allowed.
Object o = lsa;
Object[] oa = (Object[]) o;
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
oa[1] = li; // Unsound, but passes run time store check
String s = lsa[1].get(0); // Run-time error: ClassCastException.
代码第二行到第三行怎么理解,单独理解第二行还能明白,但第三行那个强制转换具体怎么做到的?不太懂,求解释原理。。
你能理解数组也是一个对象,就能理解了,Object o=lsa,把一个数组赋值给对象o,那这时候o就是一个数组对象,后面的强转,一个数组,转化为,对象数组,也就是把数组的每一项都转化为对象,和第二步的意思一样,第二行是转一个,这里转了一个集合
http://blog.csdn.net/orzlzro/article/details/7017435
在这里看到了一样的问题,并给出了答案。我大致的理解是,java在运行时甚至赋值时候,不会根据所给泛型进行转换,只有获取值的时候会根据泛型进行输出的转换。另外以我的理解,对于类型转换,只是改变了取出内容的范围或者叫规则(有错误的话请指出),按几个字节取,转换错误就出乱码呗。异常都是jvm给抛出来的。另外数据被add进容器类之后,就已经失去它的类型信息了。都被当做object来看待。
List[] lsa = new List[10];
你的这句话能通过编辑?java是不支持范型数组的,你这么写在编译时都会报一个generic array creation的error。
http://stackoverflow.com/questions/529085/how-to-create-a-generic-array-in-java
将Object类型的对象转成了数组
第一行是无法通过编译的,这个例子是用来假设举例的。
数组是协变的,而泛型不是。不能实例化泛型类型的数组,除非type参数是一个无界通配符。
new List<String>[3]; is illegal
new List<?>[3]; is legal
如果java中的的泛型是协变的,那么就会出现,在lsa
中List<String>
类型对象中添加li(List<Integer>)
, 这样会导致ClassCastException
。
虽然他们的父类都是object,但是在jvm中最终进行转换的时候,还是会把泛型**擦除(*erasure* )**转换成的实际类型。List<Integer>
转换成List<String>
自然是转换错误了。
List<String>[] lsa = new List<String>[10]; // illegal
Object[] oa = lsa; // OK because List<String> is a subtype of Object
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
oa[0] = li;
String s = lsa[0].get(0);
参考:https://www.ibm.com/developerworks/java/library/j-jtp01255/index.html