@Autowired
private List<WalletService<Wallet>> walletServices; //Doesn't work

@Autowired
private List<WalletService> walletServices; //Everything is fine

假设我们有:
interface A<T extends W>;
interface B extends A<W1>;
interface C extends A<W2> ;
class W1 extends W;
class W2 extends W;

我知道可以注入(inject)A列表或特定的A。可以注入(inject)A列表以避免从List<A> to List<A<W>>进行显式转换吗?
现在,当我尝试一些时,我得到org.springframework.beans.factory.NoSuchBeanDefinitionException

我认为此功能对于实现这样的类层次结构是必需的:
interface WalletService<T exends Wallet>
interface TradeWalletService extends WalletService<TradeWallet>
interface PersonalWalletService extends WalletService<PersonalWallet>

也许我想念一些东西。
预先感谢您的答复!

最佳答案

根本原因来自Java中的泛型定义,因此WalletService<TradeWallet> 不是WalletService<Wallet>,的子类,因此Spring无法匹配Bean。
其中一种解决方案可以使用上限通配符:

private List<WalletService<? extends Wallet>> walletServices;

还有一种替代方法,它容易出错并且具有副作用。如果您对WalletService进行注释,以便Spring为它创建一个代理对象,那么WalletService<TradeWallet>WalletService<PersonalWallet>都将被包装到代理对象中,并且对于外部世界,它们看起来都像WalletService,而没有任何泛型信息。一旦您要注入(inject),就会导致问题,例如WalletService<TradeWallet>和Spring将失败,因为这两个代理对象都与此bean定义相匹配。

09-11 05:32