1. 程式人生 > >從頭認識java-13.12 超類通配符

從頭認識java-13.12 超類通配符

ext list http 創建 text mil net err 認識

這一章節我們來討論一下超類通配符。

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 超類通配符