У меня такой интерфейс:
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, создав свой интерфейс и реализовав классы.




Вам нужно добавить переменную типа в свой интерфейс.
Интерфейс:
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> {}
interface ProvidersFilter<Q> { void setQuery(Q query); Q apply(); }