@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定义相匹配。