Как обобщить мой интерфейс

У меня такой интерфейс:

public interface ProvidersFilter {
    void setQuery(@NonNull Object query);

    Object apply();
}

И следующие классы реализации:

Первая реализация:

public class ProvidersRemoteFilter implements ProvidersFilter {

    private Query mQuery;

    @Override
    public void setQuery(@NonNull Object query) {
        if (query instanceof Query) {
            mQuery = (Query) query;
        } else {
            throw new RuntimeException("query object must be of type com.google.firebase.firestore.Query");
        }
    }

    @Override
    public Object apply() {
        return mQuery;
    }
}

Вторая реализация:

public class ProvidersLocalFilter implements ProvidersFilter {

    private String mQuery;

    @Override
    public void setQuery(@NonNull Object query) {
        if (query instanceof String) {
            mQuery = (String) query;
        } else {
            throw new RuntimeException("query object must be of type String");
        }
    }

    @Override
    public Object apply() {
        return mQuery;
    }
}

Я бы хотел избежать использования instanceof, создав свой интерфейс и реализовав классы.

interface ProvidersFilter<Q> { void setQuery(Q query); Q apply(); }
shmosel 30.05.2018 01:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
148
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно добавить переменную типа в свой интерфейс.

Интерфейс:

public interface ProvidersFilter<T> {
    void setQuery(@NonNull T query);

    T apply();
}

Реализующий класс:

public class ProvidersRemoteFilter implements ProvidersFilter<Query> {

    private Query mQuery;

    @Override
    public void setQuery(@NonNull Query query) {
        mQuery = query;
    }

    @Override
    public Query apply() {
        return mQuery;
    }
}

Поскольку локальные и удаленные поставщики имеют один и тот же код, у вас может быть абстрактный класс, реализующий общие черты. В этом случае интерфейс не нужен, но вы можете оставить его без изменений:

public interface ProvidersFilter<Q> {
    void setQuery(@NonNull Q query);
    Q apply();
}

abstract class AbstractProvidersFilter<Q> {
    private Q mQuery;

    @Override
    public void setQuery(@NonNull Q query) {
        mQuery = query;
    }

    @Override
    public Q apply() {
        return mQuery;
    }
}

public class ProvidersRemoteFilter extends AbstractProvidersFilter<Query> {}
public class ProvidersLocalFilter extends AbstractProvidersFilter<String> {}

Другие вопросы по теме