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 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题