黑马程序员技术交流社区

标题: 泛型为Integer的ArrayList中存放一个String类型的对象 [打印本页]

作者: 王玉玺    时间: 2011-9-1 21:29
标题: 泛型为Integer的ArrayList中存放一个String类型的对象
ArrayList<Integer> list = new ArrayList<Integer>();
在这个泛型为Integer的ArrayList中存放一个String类型的对象。
怎样才能做到呢,就是做到了,有什么应用价值呢
情举例谢谢!!
作者: 李叶    时间: 2011-9-1 22:03
泛型的目的就是为了做到类型安全……
也就是说,如果你指定了这个List的泛型为<Integer>的话
那么这个List里面放的就必须是Integer类型的对象,而不能是其他的
这样当以后从这个List里面取出对象时,Java就可以放心地把它们直接当做Integer来使用了
所以,如果你真的成功地做到了把String类型的对象放进去的话~
程序大概会挂掉吧……临死前仰天长呼:天哪!这世界上还有放心的泛型吗?……
作者: 匿名    时间: 2011-9-1 22:22
标题: 回复 楼主 的帖子
[code]public class insertStrToArray {
        public static void main(String[] args) throws Exception {
                ArrayList<Integer> list = new ArrayList<Integer>();
                Method methodAddString = list.getClass().getMethod("add", Object.class);
                methodAddString.invoke(list, "abc");
                System.out.println(list);
        }
}[/code]这个可以通过反射的方式实现,因为泛型的作用层在编译时。而反射直接获得了add方法的字节码跳过编译层在运行时直接添加。这样就骗过了编译。
作用嘛,比如你得这个集合里存放int类型的数据,但是有及个别的地方需要添加其他类型的数据。就可以用上了!
作者: 匿名    时间: 2011-9-1 22:33
在c中是不能实现的,在java中可以?还真不知道,个人感觉即使实现了,输出地时候也是Integer类型,而输入的时候实现会将其他的类型转换成Integer类型,这样的话输出就没什么意义了。。。
作者: 匿名    时间: 2011-9-1 22:50
个人愚见感觉这个没什么作用,如果真要往里加个String类型的对象,那么程序的设计是不是有问题
作者: 匿名    时间: 2011-9-1 23:07
标题: 回复 板凳 的帖子
不是的,String类型的存进去就是String类型出来。
一个程序要运行他必须经过编译阶段(javac.*.java),运行阶段(java *).
javac 可以将你的代码生成.class文件,也就是把你写得代码翻译成计算机认识的字节码。编译器在对你的代码进行编译的时候就会检查语法错误,明明指定好了只能添加Integer类型的数据,你怎么能往里边塞String 呢?
[b]但是泛型只在编译的时候起作用[/b],在运行阶段(java *)的时候,你得ArrayList已经不受泛型的控制了。也就是说跟普通的ArrayList已经没有区别。通过反射方法获得的Method本身就是字节码无需编译就能加进去。
作者: 匿名    时间: 2011-9-2 09:51
.....啥时候考试题都拿来当讨论题了,牛逼。我给你个牛逼答案吧:
ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList   list2 = list;
list2.add("hello");
作者: 匿名    时间: 2011-9-2 12:53
标题: 回复 地板 的帖子
哦~路漫漫其修远兮~
作者: 匿名    时间: 2011-9-2 20:27
[code=java]package com.Reflect.insert.test;

import java.lang.reflect.Method;
import java.util.*;

public class ReflectTest {
        public static void main(String[] args) {
                List<Integer> list = new ArrayList<Integer>();
                String str = "heima";
                Method[] method = list.getClass().getMethods();
                try {
                        method[0].invoke(list, str);
                } catch (Exception e) {
                        e.printStackTrace();
                }
                for (int i = 0; i < list.size(); i++) {
                        System.out.println(list.get(i));
                }
        }
}[/code]
作者: 匿名    时间: 2011-9-2 20:48
通过反射机制可以做到.
我想,这个东西,就是想要我们了解一下泛型的原理,
真正的应用应该不会出现这种情况吧
作者: 张强+    时间: 2011-11-7 15:36
import java.util.*;

public class ReflectTest {
        public static void main(String[] args) {

List<Integer> list = new ArrayList<Integer>();
String str="abc";
list.getClass().getMethod("add", Object.class).invoke(list, str);
System.out.println(list.get(0));
}
}
作者: 仵先进    时间: 2012-2-29 11:12
匿名者 发表于 2011-9-2 09:51
.....啥时候考试题都拿来当讨论题了,牛逼。我给你个牛逼答案吧:
ArrayList list = new ArrayList();
Arra ...

牛逼是够牛逼的可是这是神马情况原理呀
作者: 梁锡伟    时间: 2012-3-7 19:19
仵先进 发表于 2012-2-29 11:12
牛逼是够牛逼的可是这是神马情况原理呀

向上兼容。。为了兼容1.5之前的版本
作者: ۩大世界小人物    时间: 2014-6-26 17:37
顶  一楼一个!!!
作者: 当我遇上你    时间: 2015-1-8 13:51
张强+ 发表于 2011-11-7 15:36
import java.util.*;

public class ReflectTest {

先简析成Integer再还原成String可以吗
作者: fightingwang    时间: 2015-2-4 20:36
楼上的各位大神,谢谢你们,受教了
作者: mengxiang1993    时间: 2015-2-5 11:26
受益良多
作者: 刘聪聪    时间: 2015-2-12 12:51
非常感谢
作者: franksight    时间: 2015-3-9 19:17
受教了,有用。。。
作者: 朱明仁    时间: 2015-3-11 23:59
张强+ 发表于 2011-11-7 15:36
import java.util.*;

public class ReflectTest {

只能膜拜!短小精悍!
作者: 疯狂小小菜鸟    时间: 2015-3-30 13:48
原来如此啊
作者: babadan    时间: 2015-4-23 14:43
来学习的,懂了
作者: sdgxy92    时间: 2015-5-4 17:11
梁锡伟 发表于 2012-3-7 19:19
向上兼容。。为了兼容1.5之前的版本

如果使用向上兼容,泛型就没有意义了吧?


作者: 古典牧童    时间: 2015-5-8 11:06
匿名者 发表于 2011-9-1 22:22
这个可以通过反射的方式实现,因为泛型的作用层在编译时。而反射直接获得了add方法的字节码跳过编译层在运 ...

非常 感谢
作者: 古典牧童    时间: 2015-5-8 13:55
匿名者 发表于 2011-9-2 09:51
.....啥时候考试题都拿来当讨论题了,牛逼。我给你个牛逼答案吧:
ArrayList list = new ArrayList();
Arra ...

我晕,这样可行吗
作者: 文森    时间: 2015-5-9 09:33
反射还是有些搞不懂!
作者: hzhzhen    时间: 2015-5-26 10:57
张强+ 发表于 2011-11-7 15:36
import java.util.*;

public class ReflectTest {

导包和声明异常啊
作者: edithe    时间: 2015-6-1 22:11
真是 要好好学习啊
作者: 行意天下    时间: 2015-6-17 11:38
这个只有理解了泛型和反射到了一定的深度才能写出来啊,我刚开始想着基本不太可能,哎,学海无涯啊!:Q
作者: RockLee    时间: 2015-6-21 18:52
受教了,谢谢。
作者: EnderDBluse    时间: 2015-6-23 16:18
膜拜大神:handshake
作者: EnderDBluse    时间: 2015-6-25 09:48
顶一个:lol:lol
作者: 杜弦东.    时间: 2015-7-12 23:44
受用了各位的思路,真是谢谢了
作者: pi408637535    时间: 2015-7-23 10:20
   为什么能再ArrayList<Interger>加入String变量,The method add(Integer) in the type ArrayList<Integer> is not applicable for the arguments (String) 你要知直接加就是这个错误。编译阶段就会保存(存入类型和申明类型不一样),但是可以通过反射动态加载。   但是用于实际个人认为无任何意思:因为String类型被当做Integer类型解析 (java.lang.String cannot be cast to java.lang.Integer)。
作者: 愤怒的哈博兔    时间: 2015-8-11 01:19
学习了,好吧,反射~
作者: xiao_D    时间: 2015-9-12 09:46
匿名者 发表于 2011-9-2 09:51
.....啥时候考试题都拿来当讨论题了,牛逼。我给你个牛逼答案吧:
ArrayList list = new ArrayList();
Arra ...

蠢蛋   
作者: 一只玉米    时间: 2015-9-12 22:54
匿名者 发表于 2011-9-1 22:22
这个可以通过反射的方式实现,因为泛型的作用层在编译时。而反射直接获得了add方法的字节码跳过编译层在运 ...

Method methodAddString = list.getClass().getMethod("add", Object.class);
                methodAddString.invoke(list, "abc");

这个“abc”是当被做Object类型的加进去的吧?算是一个String类型的对象么?
作者: 信陵公子    时间: 2015-10-25 12:02
匿名者 发表于 2011-9-1 22:22
这个可以通过反射的方式实现,因为泛型的作用层在编译时。而反射直接获得了add方法的字节码跳过编译层在运 ...

加上这句话
import java.lang.reflect.Method;
作者: haocds3015    时间: 2015-11-2 23:27
跪拜,短小精悍
各位大神
一个反射颠覆以前的学习知识
作者: xinxiangchen    时间: 2015-11-27 21:24
又长见识了~
作者: olivor    时间: 2015-12-26 00:00
bucuo{:2_30:}
作者: only-hou    时间: 2016-2-17 00:21
高人好多啊
作者: wuwenxiao    时间: 2016-4-20 09:16
长见识啦
作者: psuugdufnm    时间: 2016-5-15 00:11
这题太有意思了~
作者: psuugdufnm    时间: 2016-5-15 00:12
也就是说,要我们打破泛型的作用,跟底层做对吧
作者: 68帅锅    时间: 2016-8-21 15:38
修炼无岁月啊,贫道还是继续闭关吧
作者: chennnnnn    时间: 2016-9-18 22:22
给力给力




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2