a63181182
2015-02-12 04:18
采纳率: 100%
浏览 2.1k
已采纳

JAVA中使用泛型擦除的问题

import java.util.ArrayList;

public class Fanxing {

 public static void main(String[] args) throws Exception{  
     ArrayList<Integer> arrayList3=new ArrayList<Integer>();
     arrayList3.add(1);//这样调用add方法只能存储整形,因为泛型类型的实例为Integer
     arrayList3.getClass().getMethod("add", Object.class).invoke(arrayList3, "asd");
     for (int i=0;i<arrayList3.size();i++) {
        System.out.println(arrayList3.get(i));
     }


     ArrayList<String> arrayList2=new ArrayList<String>();
     arrayList2.add("asd");//这样调用add方法只能
        存储整形,因为泛型类型的实例为Integer
     arrayList2.getClass().getMethod("add", Object.class).invoke(arrayList2, 1);
     for (int i=0;i<arrayList2.size();i++) {
        System.out.println(arrayList2.get(i));
    }
 }  

}
输出结果为:
1
asd
asd
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at Fanxing.main(Fanxing.java:19)

请问这是什么问题?

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

5条回答 默认 最新

  • lycccxzt 2015-02-12 07:27
    最佳回答
       我运行了下, 找到原因了, 原因是System.out.println() 造成的。
       这个方法可传的参数为基础类型和Object对象,还提供了一个String对象的方法参数。
       第一个例子中List是Integer泛型,System.out.println() 是没有提供对应的方法参数, 所以会调用Object参数的方法,Integer转Object是没问题的,所以通过了。
       第二个例子中List是String泛型,System.out.println() 提供了String参数的就去,所以用的是以String为参数的方法,但是list中的第2个值你用了反射传的是个数值,这里会做个强转,从Integer转成String,所以出错。
    
    评论
    解决 无用
    打赏 举报
查看更多回答(4条)

相关推荐 更多相似问题