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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 悠然丶 中级黑马   /  2014-4-20 12:20  /  1357 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 悠然丶 于 2014-4-21 13:11 编辑

ArrayList<Integer> list = new ArrayList<Integer>(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。  各位大神们 这个能存吗

9 个回复

倒序浏览
应该不能
回复 使用道具 举报
可以存,泛型的存在时间是在编译时期,而反射的动作是在运行时期。所以可以通过反射添加不同于泛型的类型。
代码如下:
  1. package exercise;

  2. import java.lang.reflect.InvocationTargetException;
  3. import java.lang.reflect.Method;
  4. import java.util.ArrayList;
  5. import java.util.Iterator;

  6. /**
  7. * ArrayList<Integer> list = new ArrayList<Integer>();
  8. * 在这个泛型为Integer的ArrayList中存放一个String类型的对象。
  9. * @author feaoes
  10. *
  11. */
  12. public class Test3 {

  13.         public static void main(String[] args) {
  14.                 ArrayList<Integer> list = new ArrayList<Integer>();
  15.                 list.add(1);
  16.                 list.add(2);
  17.                 for(Integer it:list)
  18.                 {
  19.                         System.out.println(it);
  20.                 }
  21.                
  22.                
  23.                         try {
  24.                                 Method clazzMethod=ArrayList.class.getMethod("add", Object.class);
  25.                                 clazzMethod.invoke(list, "abc");
  26.                                 Iterator<Integer> it=list.iterator();
  27.                                 while(it.hasNext())
  28.                                 {       
  29.                                         System.out.println(it.next());
  30.                                 }
  31.                         } catch (NoSuchMethodException e) {
  32.                                 e.printStackTrace();
  33.                         } catch (SecurityException e) {
  34.                                 e.printStackTrace();
  35.                         } catch (IllegalAccessException e) {
  36.                                 e.printStackTrace();
  37.                         } catch (IllegalArgumentException e) {
  38.                                 e.printStackTrace();
  39.                         } catch (InvocationTargetException e) {
  40.                                 e.printStackTrace();
  41.                         }
  42.                        
  43.                        
  44.                
  45.                
  46.         }

  47. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
泛型的出现就是为了限制集合中存放的元素的
  1. import java.util.ArrayList;
  2. import java.util.Iterator;

  3. public class SunJingQi {

  4.         public static void main(String[] args) {

  5.                 ArrayList al = new ArrayList();

  6.                 al.add("孙旌棋");
  7.                 al.add("孙旌棋");
  8.                 al.add("孙旌棋");
  9.                 al.add(123);
  10.                
  11.                 for (Iterator it = al.iterator(); it.hasNext();) {
  12.                         sop(it.next());
  13.                 }
  14.         }

  15.         public static void sop(Object obj) {
  16.                 System.out.println(obj);
  17.         }

  18. }
复制代码

早期这样的代码是没有问题的, 但是带来了安全隐患, 就好像你开发一个银行的项目, 里面有一个集合存放的是金额,结果存进去的字符串, 结果编译竟然还通过了, 想想也是有点危险啊, 所以出现了泛型, 用来限定集合中出现的元素类型, 可以让程序员在编译的时候就能发现问题的所在,
回复 使用道具 举报
如果加上了泛型,那么会直接报错的额哦
  1. import java.util.ArrayList;
  2. import java.util.Iterator;

  3. public class SunJingQi {

  4.         public static void main(String[] args) {

  5.                 ArrayList<String> al = new ArrayList<String>();

  6.                 al.add("孙旌棋01");
  7.                 al.add("孙旌棋02");
  8.                 al.add("孙旌棋03");
  9.                 al.add(123);// 这里直接就会报错的
  10.                
  11.                 for (Iterator<String> it = al.iterator(); it.hasNext();) {
  12.                         sop(it.next());
  13.                 }
  14.         }

  15.         public static void sop(Object obj) {
  16.                 System.out.println(obj);
  17.         }

  18. }
复制代码

同学,这下你应该明白泛型是用来干嘛的吧

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
清风有意 发表于 2014-4-20 12:39
可以存,泛型的存在时间是在编译时期,而反射的动作是在运行时期。所以可以通过反射添加不同于泛型的类型。 ...

对反射不是很了解,反射也太强大了...那定义的泛型就没有什么用了
回复 使用道具 举报
悠然丶 发表于 2014-4-20 12:53
对反射不是很了解,反射也太强大了...那定义的泛型就没有什么用了

定义泛型是为了在编译阶段给程序员看的!避免存入不想要的对象。如果没有定义泛型,那么在运行阶段就会报错,从而降低了客户的体验,这是我们不想要的。
回复 使用道具 举报
可以存
  1. public class Test4 {

  2.         public static void main(String[] args) {
  3.                 ArrayList<Integer> list = new ArrayList<Integer>();
  4.                 list.add(1);
  5.                
  6.                 try {
  7.                        
  8.                         Method add = list.getClass().getMethod("add", Object.class);
  9.                         add.invoke(list, "abc");
  10.                         System.out.println("Integer类型对象:   " + list.get(0));
  11.                         System.out.println("String类型对象:   " + list.get(1));
  12.                        
  13.                 } catch (NoSuchMethodException | SecurityException e) {
  14.                         e.printStackTrace();
  15.                 } catch (IllegalAccessException e) {
  16.                         // TODO Auto-generated catch block
  17.                         e.printStackTrace();
  18.                 } catch (IllegalArgumentException e) {
  19.                         // TODO Auto-generated catch block
  20.                         e.printStackTrace();
  21.                 } catch (InvocationTargetException e) {
  22.                         // TODO Auto-generated catch block
  23.                         e.printStackTrace();
  24.                 }
  25.         }

  26. }
复制代码
回复 使用道具 举报
长见识了!
回复 使用道具 举报
可以,泛型是在编译的时候进行的。编译的时候不能通过,如果我们避过编译时期存进去就OK 了。所以可以用反射。反射是获得字节码对象,通过字节码对象的方法存进去,能存进去,也就能取出来。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马