下列代码可通过编译,第5句在运行时,JVM发现objArray实际上是String引用类型的数组,所以不能指向Integer对象所以会抛出异常:throws ArrayStoreException at runtime
1 String[] strArray = new String[10]; 2 Integer[] intArray = new Integer[10]; 3 intArray[0]=1; 4 Object[] objArray = strArray;//数组向上转型 5 objArray[0] =intArray[0] ; // 子类对象,赋值给Objecty引用。 6 String str=strArray[0];假设JAVA 允许泛型数组,则下列语句均可通过编译。 与普通数组的差别是,运行第5句时由于“类型擦除”的缘故使得JVM认为Test<String>[] 和Test<Integer>[]同为Test[]即strList[0]与intList[0]所指向的类型均为Test,所以x[0] = intList[0]成立,并不会抛出异常,当运行到第6句时才因Integer不能直接转换为String抛出型转换异常
1 Test<String>[] strList = new Test<String>[10]; 2 Test<Integer>[] intList = new Test<Integer>[10]; 3 intList[0]=new Test<Integer>();intList[0].set(11); 4 Object[] x = strList; //数组向上转型 5 x[0] = intList[0];//与普通数组同理,编译器无法检测出问题,因为X[0]是一个Object引用 6 String str = strList[0].getValue();//同样,编译器也看不出来从Test<String>里去取出String会出现问题。我们知道JAVA的泛型是为了在编译期就检测出类型转换问题,避免运行时出现错误抛出异常,从而提高安全性的一组编程者与编译器的约定。 但是如果支持泛型数组,根据以上代码就会发现,类型转换的安全问题不但没有被解决,还藏的更深了。原本在运行时第5句就能被抛出的问题被延后到了第6句,使问题更难以被发现和解决。 如果有错误请帮忙指出。Thanks♪(・ω・)ノ