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

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

java中的通用類型:如何定義返回多個不同類型的函數(shù)

java中的通用類型:如何定義返回多個不同類型的函數(shù)

暮色呼如 2022-06-30 18:00:46
@Servicepublic class Animal {   public String name;}@Servicepublic class Dog extends Animal {   public String name;}@Servicepublic class Cat extends Animal {   public String name;}在spring boot項目中,我想通過spring框架提供的ApplicationContext獲取一個特定的bean,下面是我寫的一個簡單的例子來說明:@Componentpublic class AnimalLocator implements ApplicationContextAware {   private static ApplicationContext applicationContext;   @Override   public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {      if (PayServiceLocator.applicationContext == null) {         PayServiceLocator.applicationContext = applicationContext;      }   }   public <T extends Animal> T getService(String name) {      if("Cat".equals(name) {        applicationContext.getBean(name, Cat.class);      }      if("Dog".equals(name) {        applicationContext.getBean(name, Dog.class);      }   }}但是,編譯器提示異常:馬賽克部分應(yīng)該是狗或貓。我認為它應(yīng)該可以工作,因為 T 已經(jīng)擴展了 Animal 類,但它沒有,所以有人對此有任何想法嗎?謝謝!
查看完整描述

3 回答

?
慕娘9325324

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

由于您使用 bean 類來訪問 bean 實例,因此可以直接將類作為參數(shù)傳遞:


public <T extends Animal> T getPayService(String name, Class<T> payClass) {

   return applicationContext.getBean(name, payClass);

}


查看完整回答
反對 回復 2022-06-30
?
FFIVE

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

T當然, in getPayServicewill extend Animal。這意味著用另一種類型調(diào)用它的代碼不會編譯:


Fruit fruit = animalLocator.getPayService("Banana")

為了說明您當前的問題,請查看以下內(nèi)容:


Cat cat = animalLocator.getPayService("Dog");

T在Cat這種情況下,但您的代碼將返回一個Dog.


為了規(guī)避編譯器錯誤,您可以添加類型轉(zhuǎn)換:


return (T) applicationContext.getBean(...

但這仍然不安全,因為編譯器仍然無法保證實際返回類型將是T運行時調(diào)用者上下文中的內(nèi)容,并且調(diào)用者將有一個類轉(zhuǎn)換異常。


如果我們可以假設(shè)這getBean是一個安全的調(diào)用,那么您應(yīng)該將您的方法更改為此實現(xiàn):


public <T extends Animal> T getPayService(String name, Class<T> cls) {

   return applicationContext.getBean(name, cls);

}

從調(diào)用者的角度來看,這并沒有太大變化,但取決于applicationContext.getBean(name, cls);將返回類型對象的事實(或假設(shè)) T。這意味著您的代碼是類型安全getBean的,但編譯器對此很滿意。


查看完整回答
反對 回復 2022-06-30
?
繁星點點滴滴

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

您可以在 Map 中自動裝配所有 Animal 實例,而不是編寫 if/else :


@Service("Animal")

public class Animal {

    public String name;

}

@Service("Dog")

    public class Dog extends Animal {

}

@Service("Cat")

    public class Cat extends Animal {

}

在你的 AnimalLocator 中:


@Component

public class AnimalLocator {


   @Autowired

   private Map<String,Animal> animals;


   public <T extends Animal> T getService(String name) {

      return this.animals.get(name);

   }

}


查看完整回答
反對 回復 2022-06-30
  • 3 回答
  • 0 關(guān)注
  • 241 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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