首頁  >  文章  >  Java  >  Java泛型通配符extends與super

Java泛型通配符extends與super

高洛峰
高洛峰原創
2016-12-19 15:57:301406瀏覽

Java 泛型

關鍵字說明

? 通配符類型

extends T> 表示類型的上界,表示參數化類型的可能是T 或是T的子類別

super T> 表示類型下界(Java Core中稱為超型別限定),表示參數化型別是此型別的超型別(父型別),直到Object

extends 範例

static class Food{class}
static class Fruit extends Food{}
static class}
static class Fruit extends Food{}
static class}
static class Fruit extends Food{}
static class} Apple extends Fruit{}
static class RedApple extends Apple{}

List extends Fruit> flist = new ArrayList();
// complie error:
// flist.add(new Apple());
// flist.add(new Fruit());

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

flist.add(null); // only work for null



List extends Frut>表示“具有任何從Fruit繼承類型的清單”,編譯器無法確定List所持有的類型,所以無法安全的向其中新增物件。可以加null,因為null 可以表示任何類型。所以List 的add 方法不能加入任何有意義的元素,但可以接受現有的子型別List 賦值。

Fruit fruit = flist.get(0);

Apple apple = (Apple)flist.get(0);



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

flist.contains(new Fruit());

flist.contains(new Apple());

在使用Collection中的contains 方法時,接受Object 參數類型,可以不涉及任何通配符,編譯器也允許這麼調用。

super 範例

List super Fruit> flist = new ArrayList();
flist.add(new Fruit());
flist.add(new Apple());
flist.add(new RedApple());

// compile error:

List super Fruit> flist = new ArrayList();



List super Fruit> 表示“具有任何Fruit超類型的列表”,列表的類型至少是一個Fruit 類型,因此可以安全的向其中添加Fruit 及其子類型。由於List super Fruit>中的類型可能是任何Fruit 的超類型,無法賦值為Fruit的子類型Apple的List.

// compile error:

Fruit item = flist.get(0);

因為,List super Fruit>中的類型可能是任何Fruit 的超類型,所以編譯器無法確定get回傳的物件類型是Fruit,還是Fruit的父類Food 或Object.

小結

extends可用於的回傳類型限定,不能用於參數類型限定。

super 可用於參數類型限定,不能用於傳回型別限定。
>帶有super超類型限定的通配符可以向泛型對易用寫入,並且帶有extends子類型限定的通配符可以向泛型物件讀取。


🎜🎜🎜更多Java泛型通配符extends與super相關文章請關注PHP中文網! 🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn