Java泛型全解

说到泛型,我们不得不先说说Java集合的缺点:
  • 当我们把一个对象加入集合后,集合就会忘记这个对象的数据类型,当再次取出对象时,该对象的编译类型就变成了Object类型(但是运行时的类型没有改变)。
  • 编译时不检查类型的异常(看下面的代码)
    如果希望创建一个List对象,且该对象只能保存字符串类型,那我们可以扩展ArrayList,下面这个List集合里只能存放String对象。
    看下面的代码
    package com.leilei;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class ListError {
    
          /**
          * @param args
          */
          public static void main(String[] args) {
               //给你一个list里同时添加字符串和int数据
               List strList = new ArrayList();
               strList.add( "hello1");
               strList.add( "hello2");
               strList.add( "hello3");
               strList.add(4);
              System. out .println(strList);
              
               //遍历数组
               for (Object obj:strList){
                  String strList1 = (String) obj;
                  System. out .println(strList1);
              }
         }
    
    }
    

    ----------------------运行结果---------------------
    [hello1, hello2, hello3, 4]
    hello1
    hello2
    hello3
    Exception in thread "main" java.lang.ClassCastException : java.lang.Integer
         at com.leilei.ListError.main(  ListError.java:22  )
    可以看见 strList.add(4)视图向List集合里添加一个int类型,在编译的时候并不报错,因为下面的system能成功的打印数组的信息 [hello1, hello2, hello3, 4],但是在遍历数组取出List的数据时,  String strList1 = (String) obj;试图将int类型转换成String类型。这个时候程序就会抛 java.lang.ClassCastException   异常。

    在引入泛型以后(看下面的代码)
    package com.leilei;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class ListError {
         
          /**
          * @param args
          */
          public static void main(String[] args) {
               List<String> strList = new ArrayList<String>();
               //给你一个list里同时添加字符串和int数据
               strList.add( "hello1");
               strList.add( "hello2");
               strList.add( "hello3");
               strList.add(4);
              System. out .println(strList);
              
               //遍历数组
    
               for (int i=0; i < strList.size(); i++){
                  System. out .println(strList.get(i));
              }
         
         }    
    }
    
    在程序的17行出现了编译错误,因为在List<String>定义的时候约束了list只能接收String类型的数据。这下 可以看见泛型的好处了吧。

    希望以上资料对大家有帮助,欢迎关注我的新浪微博:http://weibo.com/419768151

发布了50 篇原创文章 · 获赞 33 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/leilei107/article/details/17021679