A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

能否见一个String存入到泛型是Integer的List集合中?
使用hashcode存入的话能否取出来呢?

点评

可以用反射来实现,泛型只有在编译的时候才会起作用,而反射是运行时才生效,所有是没有问题的  发表于 2014-4-19 23:52

6 个回复

倒序浏览
本帖最后由 anqi 于 2014-4-19 23:17 编辑

不能 java最新的策略时候编译时期不报错,那么运行时期不报错。早期的java设计不严谨,会出现这种类型转换异常。而泛型的加入就是为了避免这种异常。
虽然在运行时,泛型是不存在的,即List<Integer>类 实际的运行是List类,即不存在泛型类。(泛型大多只在编译时期)
但它在编译时期就检查你加入的元素是不是Integer类型,防止你运行的时候抛出异常。也就是你想添加String类型的,直接编译不通过。
早期的java设计不严谨如
int[] arr={1,3}
Number brr= arr;
brr[1]=4.5;
上面的两个引用型变量数组指向同一片内存空间,往里添加编译的正常,运行的时候会抛出异常。
泛型是1.5加入的,就是为了防止集合出现这种情况。

额看楼下说了反射 ,貌似还真行,自己从来没往这上面想过。
回复 使用道具 举报
可以啊 通过反射就能做到
后面那个问题没看明白
回复 使用道具 举报
直接向泛型为Integer的List集合中是不能加入String类型的,这就要涉及到程序的生命周期,在javac时候,程序会检查List只能接收Integer类型的参数,但是该类被编译成为字节码之后,就会忽略点Integer对象,也就是说在这个时候它什么类型的数据都能接收到,然而要获得一个类的字节码,我们可以通过使用反射的方法得到,此时由于对该类所接收的数据没有什么限制,所以此时就能接收到任意类型的数据,当然也包括String了。对于你说使用hashcode是否能取出来,不知道你的原意是什么,我的理解是你想要问是否可以将String存入hashcode中,并从中取出该String,答案是能,只要在存入过后你不修改参数hashcode算法的元素,那么完全是可以取出的,如果你修改了参与hashcode算法的元素,那你的数据存储的位置就会发生变化,故你不能取到存入的String值,不知道理解对不对
回复 使用道具 举报
龙健 发表于 2014-4-20 15:47
直接向泛型为Integer的List集合中是不能加入String类型的,这就要涉及到程序的生命周期,在javac时候,程序 ...

嗯,了解了
回复 使用道具 举报
本帖最后由 の放下执著 于 2014-4-20 21:09 编辑

可以!可以通过反射,先获取字节码,再获取字节码中的add方法,然后放进去。
泛型是给编译器看的,反射可以透过编译器。使用hashcode存入的话能否取出来呢?
哥们,我理解不了这句话,嘿嘿。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马