Несовместимые типы. Требуется: T, найдено T. Почему? - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь создать сервисный локатор с использованием обобщений и получаю предупреждения от компилятора по адресу 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;
}

1 Ответ

1 голос
/ 18 мая 2019

Вы определили несколько универсальных типов с одним и тем же именем.

public class SimpleServiceLocator <T>

определяет универсальный тип T на уровне класса

<T> void setService

определяет универсальный тип T на уровне функции

Если вы используете T внутри своих функций, вы будете использовать T из определения вашей функции, которое отличается от типаВы использовали, чтобы объявить свой HashMap

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...