Java 泛型中的萬用字元

2021-08-21 18:51:33 字數 1396 閱讀 7839

萬用字元有 3 種形式

1>無限定萬用字元

public

void

testwildcards(collection> collection)

上面的**中,方法內的引數是被無限定萬用字元修飾的 collection 物件,它隱略地表達了乙個意圖或者可以說是限定,那就是 testwidlcards() 這個方法內部無需關注 collection 中的真實型別,因為它是未知的。所以,你只能呼叫 collection 中與型別無關的方法(即不能向collection中新增新元素)

2> < ? extends t> 和 < ? super t>

class

grandf

class

father

extends

grandf

class

sonextends

father

class

grands

extends

son

下面是這四個類之間的繼承關係

當我們執行這段**時:

class

testsub

}

< ? extends grandf> 其實就是對集合內元素型別的約束,沒錯,它是要求這個集合內元素型別必須在這個範圍內,但是一旦它以引數形式傳入時,就確定了它的型別,但在這段**塊中,編譯器只能確定,傳入的集合的元素型別是grandf或它的的子類,但當元素是grandf的子類時,父類grandf並不屬於子類型別,自然不能add進去(型別不匹配)。同理,father類,son類,grands類都不能add進去,因為你只知道上界在grandf處,但無法確定下界到底在**,所以無法向其中新增新的元素但當我們執行**:

class

testsub

}

編譯器居然沒有報錯!很多小夥伴都驚呆了,但如果看到這裡也感到驚訝的話就證明你沒有理解上面的那一段話,我們再來解釋一遍:

在這段**中,要求集合中元素的型別必須是grandf或其父類,但是無論這個集合中元素型別是誰,它肯定是 grandf,father,son,grands的父類,沒錯,又是那句話:

在這裡 我們指定了下界是grandf但是不知道上界到底在**。所以這個時候,我們所看到的這四個類,都屬於grandf或其父類的型別,所以都可以add進去

上面的這些東西確實有些繞,理解起來也有些困難,但這確實是多型與泛型結合的乙個典型問題,一定要理解,可以自己敲幾遍**測試。

Java泛型 萬用字元的限定

當我們宣告乙個泛型類變數時,編譯器會用具體的型別代替泛型類的型別變數。比如,我們有下面這些類 package generic version 1.00 2004 05 10 author cay horstmann public class pair public pair t first,t se...

java泛型中萬用字元的使用詳解

public static void main string args public static void f list list 在上面 中,程式能正常執行。但是當你要在方法f 中進行add操作時就會發現,該list新增除了null之外任何值,編譯都會出錯。萬用字元也像一般的泛型引數一樣,可以使...

Java泛型總結(集合泛型 方法泛型 萬用字元)

1,泛型的限定 public static void main string args swap new string,1,2 swap new integer,2,3 泛型引數必須為引用型別 2,泛型方法 泛型類定義的反應,在整個類中有效,如果被方法使用,那麼泛型類的物件明確要操作的具體型別後,所...