java泛型中有extends_java泛型中extends 和 super的區別

一般對反省中extends 和 super 的區別是這樣介紹的:

關鍵字說明

? 通配符類型

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

super T> 表示類型下界(Java Core中叫超類型限定),表示參數化類型是此類型的超類型(父類型),直至Object看了這個我是不太明白,換成白話是這個意思:

List extends T> 是說 這個list放的是T或者T的子類型的對象,但是不能確定具體是什么類型,所以可以get(),不能add()(可以add null值)

List super T> 是說這個list放的是至少是T類型的對象,所以我可以add T或者T的子類型,但是get得到的類型不確定,所以不能get

引用下網上遍地的例子

extends 示例

static class Food{}

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子類型限定的通配符可以向泛型對象讀取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值