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

在并行泛型层级结构中获取泛型类型的实现方案

问题解决:根据Rule泛型匹配对应Datasource

一、获取Rule的泛型类型(ruleType)

由于Java泛型擦除机制,运行时无法直接从Rule<?>实例中获取泛型参数的Class对象,最可靠的方式是在Rule基类中显式保存泛型类型的引用:

1. 修改Rule基类定义

public abstract class Rule<T> {
    private final Class<T> type;

    // 子类通过构造方法传入泛型对应的Class
    protected Rule(Class<T> type) {
        this.type = type;
    }

    // 提供获取泛型类型的方法
    public Class<T> getType() {
        return type;
    }
}

2. 实现具体Rule子类

每个具体规则类在构造时传入对应的泛型Class:

public class RuleA extends Rule<A> {
    public RuleA() {
        super(A.class);
    }
}

public class RuleB extends Rule<B> {
    public RuleB() {
        super(B.class);
    }
}

public class RuleC extends Rule<C> {
    public RuleC() {
        super(C.class);
    }
}

在Stream操作中,直接调用rule.getType()就能拿到对应的Class<A>/Class<B>/Class<C>:

ruleList.stream().map(rule -> {
    Class<?> ruleType = rule.getType();
    // 后续结合DatasourceResolver获取对应数据源
    // ...
})

二、实现DatasourceResolver

DatasourceResolver本质是一个泛型类型与数据源实例的注册表,负责根据Class对象匹配对应的Datasource<T>:

1. DatasourceResolver代码实现

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class DatasourceResolver {
    // 用线程安全的Map存储类型与数据源的映射
    private final Map<Class<?>, Datasource<?>> datasourceRegistry = new ConcurrentHashMap<>();

    // 注册数据源:绑定泛型类型和对应的数据源实例
    public <T> void registerDatasource(Class<T> type, Datasource<T> datasource) {
        datasourceRegistry.put(type, datasource);
    }

    // 根据类型解析数据源,通过unchecked强转实现泛型匹配
    @SuppressWarnings("unchecked")
    public <T> Datasource<T> resolve(Class<T> type) {
        Datasource<T> datasource = (Datasource<T>) datasourceRegistry.get(type);
        if (datasource == null) {
            throw new IllegalArgumentException("未找到类型[" + type.getName() + "]对应的数据源");
        }
        return datasource;
    }
}

2. 使用DatasourceResolver

先提前注册所有数据源实例:

// 初始化解析器并注册数据源
DatasourceResolver resolver = new DatasourceResolver();
resolver.registerDatasource(A.class, new DatasourceA());
resolver.registerDatasource(B.class, new DatasourceB());
resolver.registerDatasource(C.class, new DatasourceC());

然后在Stream操作中完整调用:

ruleList.stream().map(rule -> {
    Class<?> ruleType = rule.getType();
    // 强转泛型类型,适配通配符场景
    @SuppressWarnings("unchecked")
    Class<Object> typedClass = (Class<Object>) ruleType;
    Datasource<Object> datasource = resolver.resolve(typedClass);
    return datasource.doSomething();
}).collect(Collectors.toList());

或者借助Rule的泛型方法实现严格匹配:

ruleList.stream().map(rule -> {
    // 利用Rule的getType()返回的泛型Class直接匹配
    Datasource<?> datasource = resolver.resolve(rule.getType());
    return datasource.doSomething();
}).collect(Collectors.toList());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:10:28