如何生成我的界面

How to generify my interface

我有以下界面:

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

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

由于本地和远程提供程序具有相同的代码,您可以使用抽象 class 来实现共同点。在这种情况下,不需要界面,但您可以保持不变:

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