I have a "strange" problem about Java generics.
First I list my code:
Service.class
package jse.generics.service;
public interface Service {
}
ServiceProvider.class
package jse.generics.service;
public interface ServiceProvider<T extends Service> {
    public T getService();
}
ServiceProviderRegistry.class
package jse.generics.service;
import java.util.HashMap;
import java.util.Map;
public class ServiceProviderRegistry<T extends Service> {
     private Map<Class<T>, ServiceProvider<T>> map = new HashMap<Class<T>, ServiceProvider<T>>();
     public void register(Class<T> clazz, ServiceProvider<T> provider) {
          map.put(clazz, provider);
     }
}
FooService.class
package jse.generics.service;
public class FooService implements Service {
}
FooServiceProvider.class
package jse.generics.service;
public class FooServiceProvider implements ServiceProvider<FooService> {
     @Override
     public FooService getService() {
          return new FooService();
     }
}
ServiceTest.class
package jse.generics.service;
public class ServiceTest {
     /**
     * @param args
     */
     public static void main(String[] args) {
          ServiceProviderRegistry<? extends Service> registry = new ServiceProviderRegistry<Service>();
          registry.register(FooService.class, new FooServiceProvider());
     }
}
In the ServiceTest class the compiler complaints that the registry.register method is not applicable for arguments passed to it.I really don't know why this happens. So I am looking forward to you guy's help to solve this problem.
 
     
     
     
     
    