1. 程式人生 > >java泛型<? extends E> 有上限萬用字元與<? Super E>有上限萬用字元

java泛型<? extends E> 有上限萬用字元與<? Super E>有上限萬用字元

萬用字元?,?表示佔位,表明將來使用的時候在指明型別

  •  <?>無限定的萬用字元, 是讓泛型能夠接受未知型別的資料
  • <? extends E> 有上限萬用字元,能夠接受指定類及其子類型別的資料,E就是該泛型的上邊界 
      • 注意:這裡不僅繼承了父類E的子類,也可以代指顯現了介面E的類
  • <? super E>:有下限的萬用字元。能夠指定其父類型別的資料,E就是該泛型型別的下邊界。
    •   注意:你可以為一個泛型指定上邊界或者下邊界,但是不能同時指定上下邊界

與<T>型別比較

  • 比起<T>型別,<?>萬用字元不需要定義型別,傳入的預設為Object,所以在方法返回值使用<?>需要將Object向下轉型為需要的型別
  • 可以直接在類中定義靜態方法,因為其<?>的型別預設為Object,是確定的型別,不需要像<T>要在方法返回值之前進行定義
  • public static void main(String[] args) {
            List<Person1> personList = new ArrayList<>();
            personList.add(
    new Person1("11", "11")); personList.add(new Person1("22", "22")); personList.add(new Person1("33", "33")); print(personList); System.out.println("======================"); List<Man> manList = new ArrayList<>(); manList.add(new Man("11", "
    11")); manList.add(new Man("22", "22")); manList.add(new Man("33", "33")); print(manList); } /** * List<? extends Person1> :有上限的萬用字元,表示傳入的物件只能是Person1 或其的子類, <E>元素型別代表這個泛型萬用字元的上限 * @param list */ static void print(List<? extends Person1> list) { for (Object o : list) { System.out.println(o); } }

 <? Super E>有上限萬用字元

  • 只能傳遞有E 及其父類到上限萬用字元中