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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沉湎码海 中级黑马   /  2017-2-14 21:58  /  553 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

泛型限定


/*
        ? 通配符,也可以理解为占位符,问号表示要传入的类型不确定。
       
        泛型的限定:
       
                ?extends E   可以接受E类型或者E的子类型。上限。(限定上面,下面不固定)
               
                ?super   E   可以接受E类型或E的父类型。下限。(限定下面,上面不固定)
               
               
               
               
*/

1.

  import  java.util.*;

  class  GenericDemo6{
          
          public  static  void  main(String[] args){
                  
                  ArrayList<String> al= new  ArrayList<String>();
                  
                  
                   al.add("abc1");
                   al.add("abc2");
                   al.add("abc3");
                  
                    ArrayList<Integer> al2= new  ArrayList<Integer>();
                  
                  
                   al2.add(4);
                   al2.add(5);
                   al2.add(6);
                  
                   printColl(al2); // 这样是报错的。
          }
         /*
           public  static  void printColl(ArrayList<String> a) //这样做会报错: ArrayList<String> a =new  ArrayList<Integer>();  这样是报错的。
          {
                  
                  Iterator<String> it =a.iterator();
                  
                  while(it.hasNext()){
                          
                          System.out.println(it.next());
                  }
          }
         */
       
          
          
          //当我们不确定要传入的数据类型时,可以这样做,写个问号方式
          
            public  static  void printColl(ArrayList<?> a)。
          {
                  
                  Iterator<String> it =a.iterator();
                  
                  while(it.hasNext()){
                          
                          System.out.println(it.next());
                  }
          }
  }


  //下面这一种的区别:T代表具体类型,你传入什么类型就是什么类型

      public  static <T>  void printColl(ArrayList<T> a)。
          {
                  
                  Iterator<T> it =a.iterator();
                  
                  while(it.hasNext()){
                          
                          System.out.println(it.next());
                  }
          }
  }

  问号与T的区别:

  T代表具体类型,你传入什么类型就是什么类型
  问号代表占位符,不明确的类型




//泛型限定:用于限定一个范围的类型 即:另一种情况: 指定一个范围的类型,例如某一个类的子类

    public  static  void printColl(ArrayList<? extends Person> a)。
          {
                  
                  Iterator<? extends Person> it =a.iterator();
                  
                  while(it.hasNext()){
                          
                          System.out.println(it.next());
                  }
          }
  }


//泛型限定有两类: 向上限定,向下限定





5.关于向下限定的理解:

        即: Person  s1  = new  Student("abc1");
       
       
       
        为什么可以向下限定???
        :
                因为多态的存在,父类引用可以接受子类对象。
       
6.泛型的向下应用用的比较少。

1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马