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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

ArrayList<Integer> list = new ArrayList<Integer>();
在这个泛型为Integer的ArrayList中存放一个String类型的对象。
怎样才能做到呢,就是做到了,有什么应用价值呢
情举例谢谢!!

46 个回复

倒序浏览
泛型的目的就是为了做到类型安全……
也就是说,如果你指定了这个List的泛型为<Integer>的话
那么这个List里面放的就必须是Integer类型的对象,而不能是其他的
这样当以后从这个List里面取出对象时,Java就可以放心地把它们直接当做Integer来使用了
所以,如果你真的成功地做到了把String类型的对象放进去的话~
程序大概会挂掉吧……临死前仰天长呼:天哪!这世界上还有放心的泛型吗?……

评分

参与人数 1黑马币 +2 收起 理由
王法印 + 2 赞一个!

查看全部评分

回复 使用道具 举报 2 0
黑马网友  发表于 2011-9-1 22:22:55
藤椅

回复 楼主 的帖子

[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类型的数据,但是有及个别的地方需要添加其他类型的数据。就可以用上了!

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 回答的不错!

查看全部评分

回复 使用道具 举报 3 0
黑马网友  发表于 2011-9-1 22:33:37
板凳
在c中是不能实现的,在java中可以?还真不知道,个人感觉即使实现了,输出地时候也是Integer类型,而输入的时候实现会将其他的类型转换成Integer类型,这样的话输出就没什么意义了。。。
回复 使用道具 举报
黑马网友  发表于 2011-9-1 22:50:48
报纸
个人愚见感觉这个没什么作用,如果真要往里加个String类型的对象,那么程序的设计是不是有问题
回复 使用道具 举报 1 0
黑马网友  发表于 2011-9-1 23:07:15
地板

回复 板凳 的帖子

不是的,String类型的存进去就是String类型出来。
一个程序要运行他必须经过编译阶段(javac.*.java),运行阶段(java *).
javac 可以将你的代码生成.class文件,也就是把你写得代码翻译成计算机认识的字节码。编译器在对你的代码进行编译的时候就会检查语法错误,明明指定好了只能添加Integer类型的数据,你怎么能往里边塞String 呢?
[b]但是泛型只在编译的时候起作用[/b],在运行阶段(java *)的时候,你得ArrayList已经不受泛型的控制了。也就是说跟普通的ArrayList已经没有区别。通过反射方法获得的Method本身就是字节码无需编译就能加进去。
回复 使用道具 举报 1 0
黑马网友  发表于 2011-9-2 09:51:25
7#
.....啥时候考试题都拿来当讨论题了,牛逼。我给你个牛逼答案吧:
ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList   list2 = list;
list2.add("hello");

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 牛逼!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-2 12:53:47
8#

回复 地板 的帖子

哦~路漫漫其修远兮~
回复 使用道具 举报
黑马网友  发表于 2011-9-2 20:27:47
9#
[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]

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 也对哦!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-2 20:48:50
10#
通过反射机制可以做到.
我想,这个东西,就是想要我们了解一下泛型的原理,
真正的应用应该不会出现这种情况吧
回复 使用道具 举报
张强+ 黑马帝 2011-11-7 15:36:27
11#
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));
}
}
回复 使用道具 举报 1 0
匿名者 发表于 2011-9-2 09:51
.....啥时候考试题都拿来当讨论题了,牛逼。我给你个牛逼答案吧:
ArrayList list = new ArrayList();
Arra ...

牛逼是够牛逼的可是这是神马情况原理呀
回复 使用道具 举报
仵先进 发表于 2012-2-29 11:12
牛逼是够牛逼的可是这是神马情况原理呀

向上兼容。。为了兼容1.5之前的版本
回复 使用道具 举报
顶  一楼一个!!!
回复 使用道具 举报
张强+ 发表于 2011-11-7 15:36
import java.util.*;

public class ReflectTest {

先简析成Integer再还原成String可以吗
回复 使用道具 举报
楼上的各位大神,谢谢你们,受教了
回复 使用道具 举报
受益良多
回复 使用道具 举报
非常感谢
回复 使用道具 举报
受教了,有用。。。
回复 使用道具 举报
张强+ 发表于 2011-11-7 15:36
import java.util.*;

public class ReflectTest {

只能膜拜!短小精悍!
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马