Search code examples
javagenericsgeneric-programming

How to generify my interface


I have the following interface:

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

    Object apply();
}

And the following implementing classes:

First implementation:

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;
    }
}

Second implementation:

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;
    }
}

I would like to avoid using instanceof by generifying my interface and implementing classes.


Solution

  • You need to add a type variable to your interface.

    Interface:

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

    Implementing class:

    public class ProvidersRemoteFilter implements ProvidersFilter<Query> {
    
        private Query mQuery;
    
        @Override
        public void setQuery(@NonNull Query query) {
            mQuery = query;
        }
    
        @Override
        public Query apply() {
            return mQuery;
        }
    }