I have a "weird" problem with Java generics.
First I listed 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 { 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 complains that the registry.register method is not applicable for the arguments passed to it. I really don't know why this is happening. Therefore, I look forward to helping you solve this problem.
Samuel gong
source share