Q: Spring injects a list with generics issue Interface:
public interface PoiSearchDataProvider<T extends AbstractPoiSearchData> {

    T fetch(PoiSearchRequest poiSearchRequest) throws Exception;

}

If I use:
@Resource
private List<PoiSearchDataProvider<AbstractPoiSearchData>> poiSearchDataProviders;

Application fails to start: expected at least 1 bean which qualifies as autowire candidate.
And it works:
@Resource
private List<PoiSearchDataProvider<? extends AbstractPoiSearchData>> poiSearchDataProviders;

I want to know the reason behind...

A: Because your interface is defined as T extends AbstractPoiSearchData,
Then List<PoiSearchDataProvider<AbstractPoiSearchData>> it is declared as single AbstractPoiSearchData which doesn't extend itself.
I think that in your case :
public interface PoiSearchDataProvider<AbstractPoiSearchData> {

    AbstractPoiSearchData fetch(PoiSearchRequest poiSearchRequest) throws Exception;

}

Will be enough and you can use magic of the polymorphism
