黑马程序员技术交流社区

标题: 泛型限定 [打印本页]

作者: 沉湎码海    时间: 2017-2-14 21:58
标题: 泛型限定
泛型限定


/*
        ? 通配符,也可以理解为占位符,问号表示要传入的类型不确定。
       
        泛型的限定:
       
                ?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.泛型的向下应用用的比较少。


作者: xiaoyizi    时间: 2017-2-14 22:32
嗯嗯,总结的不错。





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