You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何泛型化ProvidersFilter接口以避免使用instanceof

泛型化接口与实现类消除instanceof

咱直接通过泛型改造来彻底解决instanceof的问题!这样不仅能把类型检查提前到编译期,还能让代码更简洁安全,完全不用再靠运行时判断和抛异常来兜底。

第一步:泛型化ProvidersFilter接口

我们给接口添加泛型参数<T>,明确指定setQuery接收的参数类型和apply返回的类型:

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

第二步:改造ProvidersRemoteFilter实现类

直接指定泛型类型为Query,这样setQuery方法会直接接收Query类型参数,再也不需要instanceof判断:

public class ProvidersRemoteFilter implements ProvidersFilter<Query> {
    private Query mQuery;

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

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

第三步:改造ProvidersLocalFilter实现类

同样指定泛型类型为String,方法参数直接匹配类型,代码更清爽:

public class ProvidersLocalFilter implements ProvidersFilter<String> {
    private String mQuery;

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

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

改造后的优势

  • 编译期类型安全:如果有人尝试给ProvidersRemoteFilter传入非Query类型的参数,编译器直接报错,从根源避免了运行时异常。
  • 代码更简洁:去掉了冗余的类型判断和异常抛出逻辑,代码逻辑一目了然。
  • 语义更清晰:泛型参数直接表明了过滤器处理的查询类型,其他开发者一眼就能看懂每个过滤器的用途。

内容的提问来源于stack exchange,提问作者malhobayyeb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:04:11