學習使用泛型程式設計時更困惑的乙個方面是確定何時使用上界萬用字元以及何時使用下界萬用字元,此頁面提供了設計**時要遵循的一些準則。
「in」變數向**提供資料,想象一下帶有兩個引數的複製方法:copy(src, dest)
,src
引數提供要複製的資料,因此它是「in」引數。
「out」變數儲存資料以供其他地方使用,在複製示例中,copy(src, dest)
,dest
引數接受資料,因此它是「out」引數。
當然,一些變數既用於「in」又用於「out」目的 — 該場景也在指南中解決。
在決定是否使用萬用字元以及適合使用哪種型別的萬用字元時,可以使用「in」和「out」原則,以下列表提供了遵循的準則:
這些指南不適用於方法的返回型別,應該避免使用萬用字元作為返回型別,因為它強制程式設計師使用**來處理萬用字元。
由list<? extends ...>
定義的列表可以非正式地認為是唯讀的,但這不是乙個嚴格的保證,假設你有以下兩個類:
class naturalnumber
// ...
}class evennumber extends naturalnumber
// ...
}
考慮以下**:
listle = new arraylist<>();
list<? extends naturalnumber> ln = le;
ln.add(new naturalnumber(35)); // compile-time error
因為list
是list<? extends naturalnumber>
的子型別,你可以將le
賦給ln
,但是你不能使用ln
將自然數新增到偶數列表中,以下列表中的操作是可能的:
你可以看到list<? extends naturalnumber>
定義的列表在嚴格意義上不是唯讀的,但你可能會這樣想,因為你無法儲存新元素或更改列表中的現有元素。
Java泛型總結(集合泛型 方法泛型 萬用字元)
1,泛型的限定 public static void main string args swap new string,1,2 swap new integer,2,3 泛型引數必須為引用型別 2,泛型方法 泛型類定義的反應,在整個類中有效,如果被方法使用,那麼泛型類的物件明確要操作的具體型別後,所...
java泛型中萬用字元的使用詳解
public static void main string args public static void f list list 在上面 中,程式能正常執行。但是當你要在方法f 中進行add操作時就會發現,該list新增除了null之外任何值,編譯都會出錯。萬用字元也像一般的泛型引數一樣,可以使...
Java泛型 萬用字元的限定
當我們宣告乙個泛型類變數時,編譯器會用具體的型別代替泛型類的型別變數。比如,我們有下面這些類 package generic version 1.00 2004 05 10 author cay horstmann public class pair public pair t first,t se...