如何传递对象参数并返回对象?如何泛型化业务规则上下文类?
解决方案:泛型改造与对象参数支持
嘿,我来帮你搞定这两个泛型相关的问题,咱们一步步拆解:
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
相关产品推荐
相关产品推荐

