黑马程序员技术交流社区

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

作者: 彭小芳    时间: 2012-2-16 10:46
标题: 泛型为Integer的ArrayList中存放一个String类型的对象
本帖最后由 pengfangjava 于 2012-2-16 16:46 编辑

我是Java初学者,问大家个简单的问题

ArrayList<Integer> list = new ArrayList<Integer>();
在这个泛型为Integer的ArrayList中存放一个String类型的对象。
怎样才能做到呢,就是做到了,有什么应用价值呢?
作者: 刘基军    时间: 2012-2-16 11:05
我也想知道,{:soso_e113:}
作者: 冯祖焱    时间: 2012-2-16 11:12
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);
        }
}
这个可以通过反射的方式实现,因为泛型的作用层在编译时。而反射直接获得了add方法的字节码跳过编译层在运行时直接添加。这样就骗过了编译。
作用嘛,比如你得这个集合里存放int类型的数据,但是有及个别的地方需要添加其他类型的数据。就可以用上了!
作者: 黄锦成    时间: 2012-2-16 11:29
可以添加,但是只能在运行时添加。java中的泛型不像C#语言那样,java泛型只在编译时有效。在张老师的高新技术那里有讲到。
作者: 李杨    时间: 2012-2-16 12:04
是感觉是为了研究尝试,也为了能多了解多学习一些知识。。作用啊,当然是人感觉的,感觉是什么作用,应该就是什么作用吧。。呵呵。。我瞎想的啊。。你旁听就行了。
作者: 丁晓宇    时间: 2012-2-16 13:07
通过反射 先获取到你那个集合的add方法 赋值给Method的对象 , 直接invoke就行了,做到了主要就是练习一下反射吧。
还有 java中List的泛型是后来才加上去的,因为从jvm内部支持泛型是一项很艰难甚至不可能的任务,只在编译器上认同了泛型,所以可以通过反射绕开编译器做到!
作者: 技术测试刘老师    时间: 2012-2-16 13:13
这位同学的问题我来解答,如果你问应用价值,我想你在面试的时候很多问题都是很基础问题,你觉得对于你的工作来说有什么应用价值么? 其次我认为这道题目考的还是比较有水平的,通过这一道题能考出至少两个知识点 第一泛型,第二反射.如果这道题你不会解答的话我觉得你有必要把基础视频都学习一遍.
作者: 彭嘉聪    时间: 2012-2-16 16:04
其实这道题很简单,但是我也忘了,泛型其实是java在编译期中用于控制类型限定的一种技术,
记住是编译期,所以这道题是在运行期处理的
运行期就会取消泛型限定,所以利用反射可以传入任意对象参数。

作者: 彭小芳    时间: 2012-2-16 16:46
技术测试刘老师 发表于 2012-2-16 13:13
这位同学的问题我来解答,如果你问应用价值,我想你在面试的时候很多问题都是很基础问题,你觉得对于你的工作 ...

谢谢老师的指点,我会更努力的




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