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

如何传递对象参数并返回对象?如何泛型化业务规则上下文类?

解决方案:泛型改造与对象参数支持

嘿,我来帮你搞定这两个泛型相关的问题,咱们一步步拆解:

1. 修改代码支持对象类型参数与对象返回值

原来的接口只支持String类型的输入,现在要扩展为支持任意对象类型的输入和输出,核心是把接口的方法参数也改成泛型类型,同时保持返回值的泛型特性。

调整后的接口定义

首先修改接口,让它同时支持输入泛型T和输出泛型R(如果你的场景中输入和输出类型相同,也可以合并为一个泛型参数):

// 修正命名规范:接口名首字母大写,拼写修正为Business
interface ApplyBusinessRule<T, R> {
    R execute(T input) throws Exception;
}

调整后的实现类

实现类对应适配新的泛型接口,逻辑中可以处理任意类型的输入对象,并返回指定类型的结果:

// 修正命名规范,实现调整后的泛型接口
class CardvaletImpl<T, R> implements ApplyBusinessRule<T, R> {
    @Override
    public R execute(T input) throws Exception {
        R result = null;
        // 这里可以根据input的实际类型编写业务逻辑
        // 示例:如果输入是User对象,构建并返回Order对象
        // if (input instanceof User) {
        //     User user = (User) input;
        //     result = (R) new Order(user.getId(), "VIP套餐");
        // }
        return result;
    }
}

对象类型的调用示例

现在可以像调用String类型一样,传递任意对象作为参数,并接收对象类型的返回值:

// 示例1:传入User对象,返回Order对象
CardvaletImpl<User, Order> userToOrderRule = new CardvaletImpl<>();
User inputUser = new User("U001", "张三");
Order outputOrder = userToOrderRule.execute(inputUser);

// 示例2:传入Product对象,返回Product对象(输入输出类型相同)
CardvaletImpl<Product, Product> productUpdateRule = new CardvaletImpl<>();
Product inputProduct = new Product("P001", "手机", 2999);
Product updatedProduct = productUpdateRule.execute(inputProduct);

2. 将BusinessRuleContext改造为泛型类

原来的上下文类使用Object存储结果和规则实例,存在类型不安全、需要强制转换的问题。改造为泛型类后,能在编译期保证类型一致性,避免运行时错误。

泛型化后的上下文类

// 修正拼写为BusinessRuleContext,改为泛型类
public class BusinessRuleContext<T, R> {
    private R ruleResult;
    private ApplyBusinessRule<T, R> businessRule;

    // 设置业务规则实例
    public void setBusinessRule(ApplyBusinessRule<T, R> businessRule) {
        this.businessRule = businessRule;
    }

    // 执行规则并返回强类型结果
    public R applyBusinessRule(T input) {
        try {
            ruleResult = businessRule.execute(input);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ruleResult;
    }
}

泛型上下文的调用示例

使用时指定输入和输出的具体类型,全程无需强制转换:

// 创建上下文,指定输入为User,输出为Order
BusinessRuleContext<User, Order> context = new BusinessRuleContext<>();

// 绑定具体的规则实现
context.setBusinessRule(new CardvaletImpl<>());

// 传入User对象执行规则,直接得到Order类型结果
User user = new User("U002", "李四");
Order order = context.applyBusinessRule(user);

额外提示

  • 注意Java命名规范:类名、接口名首字母大写,避免拼写错误(比如Buisness改为Business),这样代码可读性更高。
  • 如果你的业务场景中输入和输出类型始终一致,可以将泛型简化为单个参数T,比如ApplyBusinessRule<T>,方法定义为T execute(T input)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:02:53