Java泛型萬用字元extends與super

2021-08-31 03:46:51 字數 1742 閱讀 6542

static

class

food

static

class

fruit

extends

food

static

class

extends

fruit

static

class

extends

list<

?extends

fruit

> flist =

newarraylist()

;// complie error:

// flist.add(new fruit());

// flist.add(new object());

flist.

add(null)

;// only work for null

list<? extends fruit> 表示 「具有任何從fruit繼承型別的列表」,編譯器無法確定list所持有的型別,所以無法安全的向其中新增物件。可以新增null,因為null 可以表示任何型別。所以list 的add 方法不能新增任何有意義的元素,但是可以接受現有的子型別list 賦值。

fruit fruit = flist.

get(0)

;get(0

);

由於,其中放置是從fruit中繼承的型別,所以可以安全地取出fruit型別。

flist.

contains

(new

fruit()

);flist.

contains

(new()

);

在使用collection中的contains 方法時,接受object 引數型別,可以不涉及任何萬用字元,編譯器也允許這麼呼叫。

extends控制了元素的返回型別,所以在以下場景使用

newarraylist

<

>()

;list<

?extends

fruit

> lstfruit;

//可以將具體子型別的list賦給泛型list,在新增完成後就只能取值

add(

new())

;add

(new()

);system.out.

println

(lstfruit.

get(0)

);

list<

?super fruit> flist =

newarraylist

();flist.

add(

newfruit()

);flist.

add(

new())

;flist.

add(

new())

;// compile error:

list<

?super fruit> flist =

newarraylist()

;

// compile error:

fruit item = flist.

get(0)

;

因為,list<? super fruit>中的型別可能是任何fruit 的超型別,所以編譯器無法確定get返回的物件型別是fruit,還是fruit的父類food 或 object.

Java泛型總結(集合泛型 方法泛型 萬用字元)

1,泛型的限定 public static void main string args swap new string,1,2 swap new integer,2,3 泛型引數必須為引用型別 2,泛型方法 泛型類定義的反應,在整個類中有效,如果被方法使用,那麼泛型類的物件明確要操作的具體型別後,所...

泛型(萬用字元)

1 宣告好泛型型別之後,集合中只能存放特定型別元素 2 泛型型別必須是引用型別 3 使用泛型後取出元素不需要型別轉換.泛型函式 當函式中使用了乙個不明確的資料型別,那麼在函式上就可以進行泛型的定義。public 泛型的宣告 返回值型別 函式名 泛型 變數名 泛型類 修飾符 class 類名 泛型 泛...

泛型 萬用字元

利用泛型技術雖然解決了向下轉型所帶來的安全隱患問題,但同時又會產生乙個新的問題 即便是同乙個類,但是由於設定泛型型別的不同,那麼其物件表示的含義也是不同,是不能夠直接進行引用操作的,例如 現在有如下乙個類。class message public t getmsg 使用萬用字元 解決引數傳遞問題 p...