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

报告相同问题?

悬赏问题

  • ¥50 关于#html5#的问题:H5页面用户手机返回的时候跳转到指定页面例如(语言-javascript)
  • ¥15 无法使用此凭据登录,因为你的域不可用,如何解决?(标签-Windows)
  • ¥15 yolov9的训练时间
  • ¥15 二叉树遍历没有报错但无法正常运行
  • ¥15 在linux系统下vscode运行robocup3d上场球员报错
  • ¥15 Python语言实验
  • ¥15 SAP HANA SQL 增加合计行
  • ¥20 用C#语言解决一个英文打字练习器,有偿
  • ¥15 srs-sip外部服务 webrtc支持H265格式
  • ¥15 在使用abaqus软件中,继承到assembly里的surfaces怎么使用python批量调动