關於java中萬用字元的使用規則

2021-07-11 21:15:36 字數 2143 閱讀 9700

關於萬用字元的使用:

在api中使用萬用字元比較需要技巧,但萬用字元可以使api**靈活許多。

如果編寫的是廣泛使用的類庫,一定要適當是使用萬用字元。萬用字元有乙個原則,即:producer-extends,consumer-super(pecs).就是典型的生產者,消費者模型問題。

舉例說明:

在stack中有push方法,以及pushall方法

public class stackimplements cloneable

public stack(stackstack)

public void push(e e)

public e pop()

//ensure space for at least one more element.

private void ensurecapacity()

public stack clone()catch (clonenotsupportedexception ce)

}public void pushall(iterablesrc)

}public void popall(collectiondst)

}此時,在pushall方法中未使用萬用字元,這樣就會出現乙個問題,例如,我們在main方法裡執行這段**便會報錯:

listlist = new arraylist();

list.add(734555);

list.add(3234);

list.add(234);

int s = list.set(1, 32444);

system.out.println(s);

stackstack = new stack();

stack.push(12);

stack.pushall(list);

報錯原因是:

(list)

因為,雖然integer是number的乙個子型別,但iterable卻並不是iterable的子型別。在此時因為push是填入作為生產者,根據原則,可以新增<? extends e> 萬用字元,如果你暫時還不理解這樣做的原因,請先謹記,最開始的時候,樓主也不知道這個原則的目的,但結合經驗後,便慢慢理解了,總之,此條規則你可以謹記:

producer-extends,consumer-super(pecs)。

據此,我們便可以將pushall方法,修改為這樣:

public void pushall(iterable<? extends e>  src)

}修改後我們發現,上述的main方法中的**也不再報錯了。其實萬用字元的使用不了解的人也許會覺得很困難,但只要記住這個(生產者-消費者原則)producer-extends,consumer-super(pecs),萬用字元的使用會變得相當容易。

同時,stack還有popall方法

public void popall(collectiondst)

當我們對同型別的資料進行操作時,這段**非常完美,沒有任何問題,但這樣顯然是不夠的,**的靈活性被限制的太低太低了,例如下面這段**:

我們在原來main方法的基礎上,下面加上這段**:

listlist = new arraylist();

list.add(734555);

list.add(3234);

list.add(234);

stackstack = new stack();

stack.push(12);

stack.popall(list);

報錯原因:

(list)

原因與pushall相同,雖然integer是number的乙個子型別,但iterable卻並不是iterable的子型別。在此時因為pop是取出作為消費者,根據原則,可以新增<? super e> 萬用字元,如果你暫時還不理解這樣做的原因,請先謹記,最開始的時候,樓主也不知道這個原則的目的,但結合經驗後,便慢慢理解了,總之,此條規則在你不理解時刻必須謹記:

producer-extends,consumer-super(pecs)

據此,我們便可以將popall方法,修改為這樣:

public void popall(collection<? super e> dst)

同時,請謹記一點,作為陣列與集合比較的comparable與comparator始終是消費者,所以始終是<? super e>.

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

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

關於java重寫的規則

先說過載 過載 overloading 是在乙個類裡面,方法名字相同,而引數不同。返回型別可以相同也可以不 同。每個過載的方法 或者建構函式 都必須有乙個獨一無二的引數型別列表。再說重寫 重寫我們要遵循二同,二小,一大原則 二同 二小 一大 以上原則需要注意的為二小中的返回值型別,有的加入三同原則中...

Java 泛型中的萬用字元

萬用字元有 3 種形式 1 無限定萬用字元 public void testwildcards collection collection 上面的 中,方法內的引數是被無限定萬用字元修飾的 collection 物件,它隱略地表達了乙個意圖或者可以說是限定,那就是 testwidlcards 這個方...