第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

無法使用通配符泛型為Java集合添加值

無法使用通配符泛型為Java集合添加值

開滿天機(jī) 2019-08-03 07:03:45
無法使用通配符泛型為Java集合添加值為什么此代碼不編譯(Parent是接口)?List<? extends Parent> list = ...Parent p = factory.get();   // returns concrete implementationlist.set(0, p);    // fails here: set(int, ? extends Parent) cannot be applied to (int, Parent)
查看完整描述

3 回答

?
守候你守候我

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊

它這樣做是為了安全。想象一下,如果成功的話:

List<Child> childList = new ArrayList<Child>();childList.add(new Child());List<? extends Parent> parentList = childList;
parentList.set(0, new Parent());Child child = childList.get(0); // No! It's not a child! Type safety is broken...

意義List<? extends Parent>是“是某種類型的列表,它是Parent..我們不知道哪種類型-可能是List<Parent>..List<Child>,或List<GrandChild>.“這使取任何物品都是安全的。走出.的.List<T>API和轉(zhuǎn)換自TParent,但打電話是不安全的在……里面List<T>API轉(zhuǎn)換自ParentT..因?yàn)檗D(zhuǎn)換可能無效。




查看完整回答
反對(duì) 回復(fù) 2019-08-05
?
絕地?zé)o雙

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊

List<? super Parent>

“生產(chǎn)者-延伸,消費(fèi)者-超級(jí)”。你的List是…的消費(fèi)者Parent物品。


查看完整回答
反對(duì) 回復(fù) 2019-08-05
?
ABOUTYOU

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊

這是我的理解。

假設(shè)我們有一個(gè)泛型類型,有兩個(gè)方法

type L<T>
    T get();
    void set(T);

假設(shè)我們有一個(gè)超級(jí)類型P,而且它有子類型C1, C2 ... Cn..(為了方便起見,我們說P是自身的一個(gè)子類型,實(shí)際上是Ci)

現(xiàn)在我們也有n混凝土類型L<C1>, L<C2> ... L<Cn>,就好像我們已經(jīng)手動(dòng)寫了n類型:

type L_Ci_    Ci get();
    void set(Ci);

我們不需要手動(dòng)寫,這就是重點(diǎn)。確實(shí)有這些類型之間的關(guān)系

L<Ci> oi = ...;L<Cj> oj = oi; // doesn't compile. L<Ci> and L<Cj> are not compatible types.

對(duì)于C+模板來說,這就是故事的結(jié)尾。它基本上是宏擴(kuò)展-基于一個(gè)“模板”類,它生成許多具體的類,它們之間沒有類型關(guān)系。

對(duì)于Java來說,還有更多。我們也有一種L<? extends P>,它是任何一個(gè)超級(jí)類型的L<Ci>

L<Ci> oi = ...;L<? extends P> o = oi; // ok, assign subtype to supertype

什么樣的方法應(yīng)該存在于L<? extends P>?作為一個(gè)超級(jí)類型,它的任何方法都必須由它的子類型來預(yù)測(cè)。這種方法將起作用:

type L<? extends P>
    P get();

因?yàn)樗娜魏我粋€(gè)子類型L<Ci>,有一種方法Ci get(),它與P get()-重寫方法具有相同的簽名和協(xié)變返回類型。

這是行不通的set()不過-我們找不到X,所以void set(X)可以被void set(Ci)對(duì)任何Ci..因此set()方法不存在于L<? extends P>.

還有一個(gè)L<? super P>相反的方向。它有set(P),但不是get()..如果Si是一種超級(jí)類型的PL<? super P>是一種超級(jí)類型的L<Si>.

type L<? super P>
    void set(P);type L<Si>
    Si get();
    void set(Si);

set(Si)“重寫”set(P)不是通常意義上的,但是編譯器可以看到set(P)上的有效調(diào)用。set(Si)



查看完整回答
反對(duì) 回復(fù) 2019-08-05
  • 3 回答
  • 0 關(guān)注
  • 280 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)