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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

素胚勾勒不出你 2019-07-12 10:54:28
無法使用通配符泛型為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 回答

?
幕布斯6054654

TA貢獻1876條經(jīng)驗 獲得超7個贊

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

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..因為轉(zhuǎn)換可能無效。


查看完整回答
反對 回復(fù) 2019-07-12
?
當(dāng)年話下

TA貢獻1890條經(jīng)驗 獲得超9個贊

List<? super Parent>

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


查看完整回答
反對 回復(fù) 2019-07-12
?
人到中年有點甜

TA貢獻1895條經(jīng)驗 獲得超7個贊

這是我的理解。

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

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

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

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

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

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

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

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

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

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

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

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

因為它的任何一個子類型L<Ci>,有一種方法Ci get(),它與P get()-重寫方法具有相同的簽名和協(xié)變返回類型。

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

還有一個L<? super P>相反的方向。它有set(P),但不是get()..如果Si是一種超級類型的PL<? super P>是一種超級類型的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)


查看完整回答
反對 回復(fù) 2019-07-12
  • 3 回答
  • 0 關(guān)注
  • 571 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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