從頭認識java-13.12 超類通配符
這一章節我們來討論一下超類通配符。
1.什麽是超類通配符
在前一章節我們提到一種通配符,是使用<?
extends XXX>來實現的,導致了後面的一系列問題,如今我們引入還有一種通配符--超類通配符。它是使用<?
super XXX>來實現的。
樣例:
package com.ray.ch13; import java.util.ArrayList; public class Test { public static void main(String[] args) { ArrayList<? super Fruit> list = new ArrayList<Fruit>(); // ArrayList<? super Fruit> list2 = new ArrayList<Apple>();//error } } class Fruit { } class Apple extends Fruit { } class Fuji extends Apple { }
註意:使用超類通配符。前後的邊界必須保持一致。不然拋異常。
2.超類通配符與上一章節的通配符有什麽不同?
代碼:
package com.ray.ch13; import java.util.ArrayList; public class Test { public static void main(String[] args) { ArrayList<? extends Fruit> fruits = new ArrayList<Fruit>(); fruits.add(null);// 上一章節出現的問題 ArrayList<?super Fruit> list = new ArrayList<Fruit>(); list.add(new Fruit()); list.add(new Apple()); list.add(new Fuji()); // ArrayList<?
super Apple> list1 = new ArrayList<Fruit>();//編譯通過 ArrayList<?
super Apple> list1 = new ArrayList<Apple>(); list1.add(new Apple()); list1.add(new Fuji()); // ArrayList<? super Fuji> list2 = new ArrayList<Fruit>();//編譯通過 // ArrayList<? super Fuji> list2 = new ArrayList<Apple>();//編譯通過 ArrayList<? super Fuji> list2 = new ArrayList<Fuji>(); list2.add(new Fuji()); ArrayList<?
super Fuji> list3 = new ArrayList<Fruit>(); list3.add(new Fuji()); } } class Fruit { } class Apple extends Fruit { } class Fuji extends Apple { }
觀察上面的代碼,能夠發現:
(1)上一章節出現的問題就是不知道泛型的邊界。從而無法add對象。
(2)使用了超類通配符。創建對象的泛型邊界能夠是定義時參數類型的父類(這裏比較繞口,請看凝視);
(3)使用了超類通配符。就是定義了下界,能夠把泛型的子類和本身類型的對象add到容器裏面。
總結:這一章節註意介紹超類通配符,以及跟上一章節通配符的差別。
這一章節就到這裏。謝謝。
-----------------------------------
文件夾
從頭認識java-13.12 超類通配符