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

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

如何使方法返回類型為泛型?

如何使方法返回類型為泛型?

慕桂英3389331 2019-07-04 10:17:33
如何使方法返回類型為泛型?考慮一下這個(gè)例子(OOP書籍中的典型例子):我有一個(gè)Animal類,其中每個(gè)Animal可以有很多朋友。和子類,如Dog, Duck, Mouse等等,它添加了一些特定的行為,如bark(), quack()等。這是Animal班級(jí):public class Animal {     private Map<String,Animal> friends = new HashMap<>();     public void addFriend(String name, Animal animal){         friends.put(name,animal);     }     public Animal callFriend(String name){         return friends.get(name);     }}下面是一些包含大量類型轉(zhuǎn)換的代碼片段:Mouse jerry = new Mouse();jerry.addFriend("spike", new Dog());jerry.addFriend("quacker", new Duck()); ((Dog) jerry.callFriend("spike")).bark();((Duck) jerry.callFriend("quacker")).quack();我是否可以為返回類型使用泛型來消除類型轉(zhuǎn)換,這樣我就可以說jerry.callFriend("spike").bark();jerry.callFriend("quacker").quack();下面是一些帶有返回類型的初始代碼,作為一個(gè)從未使用過的參數(shù)傳遞給該方法。public<T extends Animal> T callFriend(String name, T unusedTypeObj){     return (T)friends.get(name);        }是否有一種方法可以在運(yùn)行時(shí)不使用額外的參數(shù)來計(jì)算返回類型instanceof?或者至少傳遞一個(gè)類型的類,而不是一個(gè)虛擬實(shí)例。我知道泛型是用于編譯時(shí)類型檢查的,但是有解決辦法嗎?
查看完整描述

3 回答

?
富國(guó)滬深

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

你可以定義callFriend這樣:

public <T extends Animal> T callFriend(String name, Class<T> type) {
    return type.cast(friends.get(name));}

然后這樣稱呼它:

jerry.callFriend("spike", Dog.class).bark();jerry.callFriend("quacker", Duck.class).quack();

此代碼的優(yōu)點(diǎn)是不生成任何編譯器警告。當(dāng)然,這實(shí)際上只是一個(gè)更新版本的鑄造前通用的日子,沒有增加任何額外的安全。


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

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

沒有。編譯器不知道哪種類型jerry.callFriend("spike")會(huì)回來的。而且,您的實(shí)現(xiàn)只是在方法中隱藏強(qiáng)制轉(zhuǎn)換,而沒有任何額外的類型安全性??紤]到這一點(diǎn):

jerry.addFriend("quaker", new Duck());jerry.callFriend("quaker", /* unused */ new Dog()); // dies with illegal cast

在這種情況下,創(chuàng)建一個(gè)抽象talk()方法并在子類中適當(dāng)?shù)刂貙懰鼘⒏玫貫槟?wù):

Mouse jerry = new Mouse();jerry.addFriend("spike", new Dog());jerry.addFriend("quacker", new Duck());
jerry.callFriend("spike").talk();jerry.callFriend("quacker").talk();


查看完整回答
反對(duì) 回復(fù) 2019-07-04
?
素胚勾勒不出你

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

您可以這樣實(shí)現(xiàn)它:

@SuppressWarnings("unchecked")public <T extends Animal> T callFriend(String name) {
    return (T)friends.get(name);}

(是的,這是法律法規(guī),見Java泛型:泛型類型定義為只返回類型.)

將從調(diào)用方推斷返回類型。但是,請(qǐng)注意@SuppressWarnings注釋:這告訴你這段代碼不是類型錯(cuò)誤..你必須親自核實(shí),否則你可以ClassCastExceptions在運(yùn)行時(shí)。

不幸的是,您使用它的方式(不將返回值賦值給臨時(shí)變量),使編譯器高興的唯一方法是這樣調(diào)用它:

jerry.<Dog>callFriend("spike").bark();

雖然這可能比選角要好一些,但您最好還是把Animal分類摘要talk()方法,正如大衛(wèi)·施密特所說。


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

添加回答

舉報(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)