请各位大师帮我分析一下这是为什么会出现如下的现象

问题描述

import java.lang.reflect.InvocationTargetException;import java.util.ArrayList;import java.util.Date;public class BaiduDemo05 { public static void main(String[] args) throws NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { ArrayList<Integer> collection1 = new ArrayList<Integer>(); collection1.getClass().getMethod("add", Object.class).invoke(collection1, "abc"); System.out.println(collection1.get(0));//ABC ArrayList<String> collection2 = new ArrayList<String>(); collection2.getClass().getMethod("add", Object.class).invoke(collection2, "abc"); System.out.println(collection2.get(0));//ABC ArrayList collection22 = new ArrayList(); collection22.getClass().getMethod("add", Object.class).invoke(collection22, "abc"); System.out.println(collection22.get(0));//ABC ArrayList<Long> collection3 = new ArrayList<Long>(); collection3.getClass().getMethod("add", Object.class).invoke(collection3, "abc"); System.out.println(collection3.get(0));//ABC ArrayList<Date> collection4 = new ArrayList<Date>(); collection4.getClass().getMethod("add", Object.class).invoke(collection4, 1); System.out.println(collection4.get(0));//ABC }}但是在将abc替换为1时,只有第2个,也就是collection2会出现异常,求解释,谢谢大师。 问题补充:chen_yongkai 写道

解决方案

至于“类型擦除”: ArrayList<String> collection2 = new ArrayList<String>(); collection2.getClass().getMethod("add", Object.class).invoke(collection2, 1); System.out.println(collection2.get(0));//ABC 编译后相当于: ArrayList collection2 = new ArrayList(); //这里是擦除了 collection2.getClass().getMethod("add", Object.class).invoke(collection2, 1); System.out.println((String)collection2.get(0));//因为 PrintStream有对应的println(String s)的方法,所以会有强制类型转化。
解决方案二:
引用那为什么下面的Date,将abc换成1后也不报错呢因为Date调用的是public void println(Object x) ,是以Object类型来打印的,不需要类型转换。
解决方案三:
ArrayList<Date> collection4 = new ArrayList<Date>(); collection4.getClass().getMethod("add", Object.class).invoke(collection4, 1); 这个直接打印就不做泛型检查了?这个是不报错的。就String的通不过,费解!!! 这个打印调用的是println(Object x)方法,Date是Object的子类能通过检查。
解决方案四:
很明显,无解。。
解决方案五:
或者这样也行:ArrayList<String> collection2 = new ArrayList<String>();collection2.getClass().getMethod("add", Object.class).invoke(collection2, 1);Object object = collection2.get(0);System.out.println(object);//ABC 总之就是想办法跳过println(String x)的泛型检查就行了。
解决方案六:
System.out.println(collection2.get(0))需要对泛型进行检查,但反射不检查泛型,你add方法是通过反射用的,get方法也应该可以通过反射用:ArrayList<String> collection2 = new ArrayList<String>();collection2.getClass().getMethod("add", Object.class).invoke(collection2, 1);//System.out.println(collection2.get(0));//ABC Object obj1 = collection2.getClass().getMethod("get", int.class).invoke(collection2, 0);System.out.println(obj1);
解决方案七:
问题出在System.out.println方法上,查看PrintStream类,发现它的println方法有如下几种: public void println(String x) {synchronized (this) { print(x); newLine();} } public void println(Object x) {synchronized (this) { print(x); newLine();} }。。。其他的就不列举了。ArrayList<String> collection2 = new ArrayList<String>(); collection2 声明的泛型是String,所以调用collection2.get(0)时,编译器认为它返回的是String 类型对象,所以println方法应该是调用第一种,如果你往collection2 中add是整数1,取回来的就是Integer对象,那么就会发生类型转换错误。至于为什么能用反射方法往collection2 中加入1,我想你应该知道的,不然不会写出这样的例子,挺有意思的。
解决方案八:
反射出来的是不带泛型的,所以可以把字符串放进List<Integer>,同理,取出来也都是Object类型,打印的话,自动调用toString,所以看到abc
解决方案九:
ArrayList<String> collection2 = new ArrayList<String>();这个泛型是String啊!collection2.getClass().getMethod("add", Object.class).invoke(collection2, 1); 肯定错了,你应该把ArrayList<String> collection2 = new ArrayList<String>();改为ArrayList<Integer> collection2 = new ArrayList<Integer>()
解决方案十:
ArrayList<String> collection2 = new ArrayList<String>();这个泛型是String啊!collection2.getClass().getMethod("add", Object.class).invoke(collection2, 1); 肯定错了,你应该把ArrayList<Integer> collection2 = new ArrayList<String>();

时间: 2024-10-24 03:32:52

请各位大师帮我分析一下这是为什么会出现如下的现象的相关文章

sql注入-请各位大师帮我看看这个.net 4 sql2008的网站有没有漏洞?

问题描述 请各位大师帮我看看这个.net 4 sql2008的网站有没有漏洞? 网站是http://www.smmzj.gov.cn 接公安部门通知,说我的网站存在许多漏洞,大量的SQL注入漏洞,我用webscan.360.cn检测出一个安全漏洞,打了补丁并修复语句后解决,现在检测是100分安全. 并没有注入漏洞,用注入检测工具也没有查出来.可能是我技术不行. 求各位大师帮我检测一下该网站是否存在漏洞?又如何修复? 解决方案 理论上说,没有没有漏洞的程序.市面上的检测软件只不过是针对一些已知的常

代码-linq多表连接查询速度很慢,但我在数据库查询分析器中却是秒查,请各位大侠帮我分析下

问题描述 linq多表连接查询速度很慢,但我在数据库查询分析器中却是秒查,请各位大侠帮我分析下 with temp as ( select (case when SHIFTSCHEDULEID is null then (case when TICKET_SELL_TYPE=2 then (select COMPANY_ID from TBL_YD_SHIFT where SHIFTNUMBER= (select SHIFTNUMBER from TBL_SP_TICKET where tick

safebitvector32-有大师帮我分析下这个类的作用吗?System.Runtime.Caching.SafeBitVector32

问题描述 有大师帮我分析下这个类的作用吗?System.Runtime.Caching.SafeBitVector32 有大师帮忙分析下这个类吗?我看出是一个索引,但是具体功能和作用还是没有完全吃透,有人能帮帮忙吗? internal struct SafeBitVector32 { private volatile int _data; internal bool this[int bit] { get { int data = this._data; return (data & bit)

请各位高手帮我分析一个架构问题。

问题描述 现在有100个不同地方的1000多台个客户机作为业务处理终端来完成业务.但是客户用网络不是很好,因为是外网容易出现断网.因为是BS架构,想在客户断网情况下依然可以维持业务.决定将服务器单独拆分为服务器.在数据中心设置一个总服务器.请问这种情况下有什么优劣势,并且采用哪种与总服务器的数据传输方式最好? 解决方案 解决方案二:可以采用回滚解决方案三:给你看看别人的服务器传输方式,你可以借鉴1.用Sock使用TCP/UDP传输2.用共享目录,通过文件传输3.用web,通过Webbrowser

请各位大虾帮我分析一下一段代码是否存在问题?

问题描述 编写了一个接口提供平板调用,在本地测试是没有问题的,可以生成txt文件,但是更新到客户服务器却没有生成txt文件,但又没有报错.好怪,自己怀疑是使用了线程导致的?对线程不了解,第一次使用!WebServiceMethod.SyncComInfo这个方法用来获取Json,数据量较大执行比较久,然而使用了线程.///<summary>同步企业信息(包括相关的证书信息)///编码字段:Wat_ComInfo:Com_Des,Com_Brand:Wat_BreedWay:Bre_Produc

android-各位高手,帮我分析以下代码在安卓手机上运行时报错的原因!

问题描述 各位高手,帮我分析以下代码在安卓手机上运行时报错的原因! //MainActivity.java如下: ```import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.webkit.WebSettings.RenderPriority;

[求助]请各位大师和版主帮我一下!跪谢!

问题描述 本人刚开始学习.Net,老师让我们用C#编一个程序,但我不怎么会,请各位大师们帮帮忙!1:做一个程序可以输入一个人的名字,生日和电话号,然后这个程序也要可以把这个人的信息显示出来,还要可以搜索这个人.(开始要先建立一个personclass)2:第一题的继续,加上可以找到一个人的年龄.3:继续加上可以输入一个人的身高和体重.(用继承)4:继续加上可以计算一个人的BMI数值.(体重(公斤)除以身高(米)的平方)5:最后要加一个作用,所有输入的人可以显示出来,包括他们的所有数据.(显示的顺

asp相当棘手的问题,请大家帮我分析下下面的代码。

问题描述 asp相当棘手的问题,请大家帮我分析下下面的代码.部分表格已经写程序完毕,实现了分组求和求平均但是还有部分表格需要数据库中的某一个值.数据库中就有直接调用但是不知道在咋调用???希望明白的兄弟帮帮我.代码如下:<%@LANGUAGE="VBSCRIPT"CODEPAGE="936"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http:/

请大家集体帮我把,这涉及到我的前程 :我今天下午2点要去面试Asp.Net程序员,他可能问到:我给你个网站你会怎么去做(要求独立去做,业务也是自己和客户谈),请有经验的朋友帮我分析下,谢谢,另外他不一定也会问这个问题,你们觉得还有哪些问题需要注意的阿!!谢

问题描述 请大家集体帮我把,这涉及到我的前程:我今天下午2点要去面试Asp.Net程序员,他可能问到:我给你个网站你会怎么去做(要求独立去做,业务也是自己和客户谈),请有经验的朋友帮我分析下,谢谢,另外他不一定也会问这个问题,你们觉得还有哪些问题需要注意的阿!!谢了.分数不多了,就这点了,我会平均分配的..谢谢大家了.. 解决方案 解决方案二:你为什么觉得他会这么问?解决方案三:我想的阿,一般去了面试的问题就一个笔试,做完后就问我法帖的问题了,你说对吧.解决方案四:楼主应聘的是什么职位呀,怎么还