泛型 泛型的通配,匹配所有的數據類型 ?

16泛型類

A:泛型類:
a:定義格式:
修飾符 class 類名<代表泛型的變量> { }

  例如,API中的ArrayList集合:
  class ArrayList<E>{ 
       public boolean add(E e){ }
    public E get(int index){  }
  }

b:使用格式:
  創(chuàng)建對象時,確定泛型的類型
 
  例如,ArrayList<String> list = new ArrayList<String>();
  此時,變量E的值就是String類型
  class ArrayList<String>{ 
    public boolean add(String e){ }
    public String get(int index){  }
  }
 
  例如,ArrayList<Integer> list = new ArrayList<Integer>();
  此時,變量E的值就是Integer類型
  class ArrayList<Integer>{ 
       public boolean add(Integer e){ }
       public Integer get(int index){  }
  }

17泛型的方法

A:泛型的方法
a:定義格式:修飾符 <代表泛型的變量> 返回值類型 方法名(參數){ }
b:泛型方法的使用:
1:例如,API中的ArrayList集合中的方法:
public <T> T[] toArray(T[] a){ }
//該方法,用來把集合元素存儲到指定數據類型的數組中,返回已存儲集合元素的數組

  使用格式:調用方法時,確定泛型的類型
?例如:
      ArrayList<String> list = new ArrayList<String>();
      String[] arr = new String[100];
      String[] result = list.toArray(arr);
   此時,變量T的值就是String類型。變量T,可以與定義集合的泛型不同
   public <String> String[] toArray(String[] a){  } 
?

  例如:
      ArrayList<String> list = new ArrayList<String>();
      Integer[] arr = new Integer[100];
      Integer [] result = list.toArray(arr);
  
  此時,變量T的值就是Integer類型。變量T,可以與定義集合的泛型不同
  public <Integer> Integer[] toArray(Integer[] a){  } 

18泛型的接口

A:泛型的接口:
/*
* 帶有泛型的接口
*
* public interface List <E>{
* abstract boolean add(E e);
* }
*
* 實現類,先實現接口,不理會泛型
* public class ArrayList<E> implements List<E>{
* }
* 調用者 : new ArrayList<String>() 后期創(chuàng)建集合對象的時候,指定數據類型
*
*
* 實現類,實現接口的同時,也指定了數據類型
* public class XXX implements List<String>{
* }
* new XXX()
*/
public class GenericDemo2 {

 }

19泛型的好處

A:泛型的好處
?a:將運行時期的ClassCastException,轉移到了編譯時期變成了編譯失敗。
?b:避免了類型強轉的麻煩。
演示下列代碼:
public class GenericDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("abc");
list.add("itcast");
//list.add(5);//當集合明確類型后,存放類型不一致就會編譯報錯
//集合已經明確具體存放的元素類型,那么在使用迭代器的時候,迭代器也同樣會知道具體遍歷元素類型

    Iterator<String> it = list.iterator();
    while(it.hasNext()){
       String str = it.next();
       System.out.println(str.length()); //當使用Iterator<String>      
                                        //控制元素類型后,就不需要強轉了。獲取到的元素直接就是String類型
    }
  }
}

20泛型的通配符

A:泛型的通配符
/*
* 泛型的通配符
*/
public class GenericDemo {
public static void main(String[] args) {
ArrayList<String> array = new ArrayList<String>();

  HashSet<Integer> set = new HashSet<Integer>();
  
  array.add("123");
  array.add("456");
  
  set.add(789);
  set.add(890);
  
  iterator(array);
  iterator(set);
}
/*
 *  定義方法,可以同時迭代2個集合
 *  參數: 怎么實現 , 不能寫ArrayList,也不能寫HashSet
 *  參數: 或者共同實現的接口
 *  泛型的通配,匹配所有的數據類型  ?
 */
public static void iterator(Collection<?> coll){
  Iterator<?> it = coll.iterator();
  while(it.hasNext()){
    //it.next()獲取的對象,什么類型
    System.out.println(it.next());
  }
}

}

21泛型的限定

A:泛型的限定
/*
* 將的酒店員工,廚師,服務員,經理,分別存儲到3個集合中
* 定義方法,可以同時遍歷3集合,遍歷三個集合的同時,可以調用工作方法
*/
import java.util.ArrayList;
import java.util.Iterator;
public class GenericTest {
public static void main(String[] args) {
//創(chuàng)建3個集合對象
ArrayList<ChuShi> cs = new ArrayList<ChuShi>();
ArrayList<FuWuYuan> fwy = new ArrayList<FuWuYuan>();
ArrayList<JingLi> jl = new ArrayList<JingLi>();

  //每個集合存儲自己的元素
  cs.add(new ChuShi("張三", "后廚001"));
  cs.add(new ChuShi("李四", "后廚002"));
  
  fwy.add(new FuWuYuan("翠花", "服務部001"));
  fwy.add(new FuWuYuan("酸菜", "服務部002"));
  
  jl.add(new JingLi("小名", "董事會001", 123456789.32));
  jl.add(new JingLi("小強", "董事會002", 123456789.33));

// ArrayList<String> arrayString = new ArrayList<String>();
iterator(jl);
iterator(fwy);
iterator(cs);

}
/*
 * 定義方法,可以同時遍歷3集合,遍歷三個集合的同時,可以調用工作方法 work
 * ? 通配符,迭代器it.next()方法取出來的是Object類型,怎么調用work方法
 * 強制轉換:  it.next()=Object o ==> Employee
 * 方法參數: 控制,可以傳遞Employee對象,也可以傳遞Employee的子類的對象
 * 泛型的限定  本案例,父類固定Employee,但是子類可以無限?
 *   ? extends Employee 限制的是父類, 上限限定, 可以傳遞Employee,傳遞他的子類對象
 *   ? super   Employee 限制的是子類, 下限限定, 可以傳遞Employee,傳遞他的父類對象
 */
public static void iterator(ArrayList<? extends Employee> array){
  
   Iterator<? extends Employee> it = array.iterator();
   while(it.hasNext()){
     //獲取出的next() 數據類型,是什么Employee
     Employee e = it.next();
     e.work();
   }
}

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容