java泛型数组的一个小问题(很简单!求解!)

代码如下:

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中的的泛型是协变的,那么就会出现,在lsaList<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