3 回答

TA貢獻1783條經(jīng)驗 獲得超4個贊
由于您使用 bean 類來訪問 bean 實例,因此可以直接將類作為參數(shù)傳遞:
public <T extends Animal> T getPayService(String name, Class<T> payClass) {
return applicationContext.getBean(name, payClass);
}

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的,但編譯器對此很滿意。

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);
}
}
添加回答
舉報