Я пытаюсь создать сервисный локатор с использованием обобщений и получаю предупреждения от компилятора по адресу
objects.put(klass, value)
Это говорит о несовместимых типах, Обязательно: T. Найдено: T.
public class SimpleServiceLocator <T> implements ServiceLocator<T> {
private HashMap<Class, Factory> services = new HashMap<>();
private HashMap<Class, T> objects = new HashMap<>();
@Override
public <T> void setService(Class<T> klass, Factory<T> factory) throws LocatorError {
if (services.containsKey(klass)) throw new LocatorError();
services.put(klass, factory);
}
@Override
public <T> T getObject(Class<T> klass) throws LocatorError {
if (services.containsKey(klass)) {
Factory factory = services.get(klass);
return (T) factory.create(this);
} else if(objects.containsKey(klass)) {
return (T) objects.get(klass);
}
throw new LocatorError();
}
@Override
public <T> void setConstant(Class<T> klass, T value) throws LocatorError {
if (objects.containsKey(klass)) throw new LocatorError();
objects.put(klass, value);
}
}
И интерфейс:
public interface ServiceLocator <T>{
<T> void setService(Class<T> klass, Factory<T> factory)
throws LocatorError;
<T> void setConstant(Class<T> klass, T value)
throws LocatorError;
<T> T getObject(Class<T> klass)
throws LocatorError;
}