public static void main(string args)
public static void f(list<?> list)
在上面**中,程式能正常執行。但是當你要在方法f()中進行add操作時就會發現,該list新增除了null之外任何值,編譯都會出錯。
萬用字元也像一般的泛型引數一樣,可以使用extends和super關鍵字限制邊界。我們對上例**使用邊界時:
使用子類萬用字元<? extends xx>
public static void main(string args)
public static void f(list<? extends number> list)
<? extends number>表示匹配number及其子類型別,故string型別匹配錯誤
父類萬用字元<? super xx>
public static void main(string args)
public static void f(list<? super number> list)
<? super number>表示匹配number及其父類型別,故long和string型別匹配錯誤
萬用字元的使用場景一般是在方法的形參上,就如上面的例子一般。但如果是直接使用的方法體裡,就會出現許多的問題。
首先,我們不能直接建立乙個萬用字元的物件,如new arraylist<?>(),new arraylist<? extends number>()等。不過我們可以使用萬用字元的宣告指向乙個泛型引用
list<?> list1 = new arraylist();
list<? extends number> list2 = new arraylist();
list<? super number> list3 = new arraylist();
其中list1和list2不能新增null之外的任何值,list3情況比較特殊,另舉例子說明
public class test
}class t1
class t2 extends t1
class t3 extends t2
對於list<? super t2> list,可以指向arraylist和arraylist的引用,但是進行add操作時,只能新增t2和t3
list<? super t2> list = new arraylist();
t1()); //編譯錯誤
list.add(new t2());
list.add(new t3());
list指向arraylist的引用,結果一樣。 Java 泛型中的萬用字元
萬用字元有 3 種形式 1 無限定萬用字元 public void testwildcards collection collection 上面的 中,方法內的引數是被無限定萬用字元修飾的 collection 物件,它隱略地表達了乙個意圖或者可以說是限定,那就是 testwidlcards 這個方...
Java泛型使用詳解
一 泛型介面 1 第一種 在子類的定義上也宣告泛型型別。package com.xieke.generics.impl.demo1 inte ce info class infoimplimplements info public void setvar t var override public ...
Java泛型 萬用字元的限定
當我們宣告乙個泛型類變數時,編譯器會用具體的型別代替泛型類的型別變數。比如,我們有下面這些類 package generic version 1.00 2004 05 10 author cay horstmann public class pair public pair t first,t se...