關於萬用字元的使用:
在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 這個方...