这是程序代码:
public class Generic<T>
{ private T[] array;
private int index = 0; @SuppressWarnings("unchecked")
public Generic(){
array = (T[])new Object[10];
} @SuppressWarnings("unchecked")
public Generic(int length){
array = (T[])new Object[length];
} public void add(T t){
array[index ++ ] = t;
}
public void setArray(T[] array){
this.array = array;
} public T[] getArray(){
return this.array;
} public static void main(String[] args)
{
String[] arr1 = {"zhongjinjin","zhongguilin","zhongyao","zhongshi"};
String[] arr2 = null; Generic<String> generic = new Generic<String>(); for(int i = 0; i < 10; i ++){
generic.add(arr1[i%4]);
}
arr2 = generic.getArray();//有问题的地方,不知道是什么原因?
System.out.println(arr2);
}
}
运行之后出现的问题
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at com.zz.jdk5.Generic.main(Generic.java:41)
public class Generic<T>
{ private T[] array;
private int index = 0; @SuppressWarnings("unchecked")
public Generic(){
array = (T[])new Object[10];
} @SuppressWarnings("unchecked")
public Generic(int length){
array = (T[])new Object[length];
} public void add(T t){
array[index ++ ] = t;
}
public void setArray(T[] array){
this.array = array;
} public T[] getArray(){
return this.array;
} public static void main(String[] args)
{
String[] arr1 = {"zhongjinjin","zhongguilin","zhongyao","zhongshi"};
String[] arr2 = null; Generic<String> generic = new Generic<String>(); for(int i = 0; i < 10; i ++){
generic.add(arr1[i%4]);
}
arr2 = generic.getArray();//有问题的地方,不知道是什么原因?
System.out.println(arr2);
}
}
运行之后出现的问题
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at com.zz.jdk5.Generic.main(Generic.java:41)
解决方案 »
- 求一本java教材
- EL表达式的疑问
- JAVA性能与C++的一些疑惑(初级)
- java中怎么根据年月周算这周得日期
- Tomcat服务器下JSP和JavaBean里使用<jsp:setProperty name="user1" property="*" />出现中文乱码,如何解决
- 设定完tomcat的环境变量后,再怎么用java从环境变量中读取它?请求帮组!急
- 一道关于garbage collection的SCJP题,请帮助!
- 请问:java中有队列(queue)这种数据结构吗?
- (求助)导入包问题,求大神来解惑啊
- java pos 针式打印
- 关于Cannot assign requested address:jvm_bind的错误
- 急!使用jxl写入多个sheet的excel文件的问题!
最后 泛型类中的 T 编译成了 Class文件之后 是Object 你可以把T全部替换成Object了之后 再看
Object[] arr2 = null;
Generic<String> generic = new Generic<String>();
for (int i = 0; i < 10; i++) {
generic.add((String) arr1[i % 4]);
}
arr2 = generic.array;// 有问题的地方,不知道是什么原因?
for (Object o : arr2) {
System.out.println(o);
}
SuppressWarnings掩盖了编译器警告
Type safety: The cast from Object[] to T[] is actually checking against the erased type Object[]
array还是Object[]的
可以得到Object数组之后 再将其元素转成String
关键是array数组中放的东西才和范型有关,
楼主可以增加一个取array里值的方法感受一下 public T get(int index) {
return array[index];
}
arr2 = generic.getArray();等同于String[] = Object[],
左右类型不相同自然就出错了
@SuppressWarnings("unchecked")
public Generic(Class c) throws Exception { array = Array.newInstance(c, 10);
} @SuppressWarnings("unchecked")
public Generic(Class c, int length) throws Exception { array = Array.newInstance(c, 10);
} public void add(Object t) {
Array.set(array, index++, t);
} public void setArray(Object array) {
this.array = array;
} public Object getArray() {
return array;
} public static void main(String[] args) throws Exception{
String[] arr1 = { "zhongjinjin", "zhongguilin", "zhongyao", "zhongshi" };
String[] arr2 = null; Generic generic = new Generic(String.class); for (int i = 0; i < 10; i++) {
generic.add(arr1[i % 4]);
}
arr2 = (String[]) generic.getArray();// 有问题的地方,不知道是什么原因?
System.out.println(arr2[0]);
}
}给你改了 下 不知道合不合需求
这样做无法按预期转换成T[]类型是由于Type ErasureType erasure enables Java applications that use generics to maintain binary compatibility with Java libraries and applications that were created before generics. Type erasure就是为了保证与此前的java库与应用程序保持(二元)兼容
以下几种都有问题
public class MyClass<E> {
public static void myMethod(Object item) {
if (item instanceof E) {
//Compiler error ...
}
E item2 = new E(); //Compiler error
E[] iArray = new E[10]; //Compiler error
E obj = (E)new Object(); //Unchecked cast warning
}
}
我的的T-->Stirng了,为什么还是会出现ClassCastException异常!
还有一点就是构造方法里面那个是没有问题的啊,在eclispe里也没有报错,难道那个就是错误的根源??
内存中实际存放的Object[]数组不能强制转换成String[]。你只有让一个Object[]类型的数组变量去引用一个内存中的String[]类型数组,这样的Object[]数组变量才可以强制转换。
为了让你看得更清楚些,只需改造一下main方法即可,其它地方不需要改动。public static void main(String[] args)
{
String[] arr1 = {"zhongjinjin","zhongguilin","zhongyao","zhongshi"};
String[] arr2 =null; Generic<String> generic = new Generic<String>(); for(int i = 0; i < 10; i ++){
generic.add(arr1[i%4]);
}
//--------------------------------------从这以上都不需要改动,我已经实际运行过。
Object[] objects=generic.getArray(); //该方法实际返回的是内存中的Object[]数组的引用
arr2=new String[objects.length]; //让arr2去引用一个内存中的String[]数组肯定是合法的。
for(int i=0;i<objects.length;i++){ // 循环遍历内存中的objects[]数组
arr2[i]=(String)objects[i];//将数组中的objects[i]元素转换成String放到arr2引用的数组
}
/*
内存中存放的那个Objects[]数组,每个元素依旧是Object类型,这个不能改变。但是Object[]数组变量objects可以去引用内存中的String[]数组。
*/
System.out.println(objects); //看看是不是[Ljava.lang.Object;@xxxxxx]。
objects=arr2; //变量objects引用一个内存中的String[]数组,此时objects才能转换 System.out.println((String[])objects);//看看是不是[Ljava.lang.String;@xxxxxx]
}