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

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条)

报告相同问题?

悬赏问题

  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?