Java 萬用字元

2021-08-28 14:56:02 字數 1138 閱讀 9578

考慮編寫列印出集合中所有元素的例程的問題。以下是您可以在舊版本的語言中編寫它(即5.0之前的版本):

voidprintcollection(collection c)

}

問題是這個新版本比舊版本更有用。雖然可以使用任何型別的集合作為引數呼叫舊**,但新**僅採用collection,正如我們剛才演示的那樣,它不是各種集合的超型別!

那麼,什麼所有型別的集合的超?它是寫的collection<?>(發音為「未知的集合」),即元素型別與任何東西匹配的集合。由於顯而易見的原因,它被稱為萬用字元型別。我們可以寫:

voidprintcollection(collection <?> c)

}

現在,我們可以用任何型別的集合來呼叫它。請注意,在裡面printcollection(),我們仍然可以讀取元素c並給它們輸入型別object。這總是安全的,因為無論集合的實際型別如何,它都包含物件。然而,向它新增任意物件是不安全的:

集合<?> c = new arraylist ();

c.add(new object()); //編譯錯誤

由於我們不知道元素型別c代表什麼,我們無法向其新增物件。該add()方法接受型別的引數e,即集合的元素型別。當實際的型別引數是?,它代表一些未知型別。我們傳遞給的任何引數add都必須是這種未知型別的子型別。由於我們不知道它是什麼型別,我們無法傳遞任何內容。唯一的例外是null,它是每種型別的成員。

另一方面,給定alist<?>,我們可以呼叫get()並使用結果。結果型別是未知型別,但我們始終知道它是乙個物件。因此,將結果分配給get()型別變數object或將其作為object期望型別的引數傳遞是安全的。

Java 萬用字元 學習

參考連線1 參考連線2 泛型的一種延伸,擴充套件.型別上界,表示引數化型別的可能是t 或是 t的子類 型別下界,表示引數化型別是此型別的超型別 父型別 直至object list list1 getfatherlist 借用參考鏈結裡面的例子 list1不能新增任何元素.只能取,list list ...

java萬用字元 隨筆

public class tongpeifu static void unboundedarg holder holder object arg static t exact1 holderholder static t exact2 holderholder,t arg static t wild...

Java萬用字元釋疑

泛型萬用字元 例子 inte ce aa class bb class a1 extends bb implements aa class b1 extends a1 list list new arraylist list list0 new arraylist list list0 解析 lis...