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

2021-08-20 22:15:53 字數 1432 閱讀 4775

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...