如何设计可返回三种类型结果的REST调用函数以减少冗余代码?
优化方案:使用泛型方法减少冗余代码
针对你这种逻辑完全一致仅返回类型不同的场景,最直接的优化方式是泛型方法,既能合并重复逻辑,又能保证类型适配。
方案1:基础泛型实现(简洁但无类型检查)
直接定义一个泛型方法,通过类型参数T指定返回类型,内部完成强制转换:
private <T> T getValue(String argument) { Object[][] code = restConnector.getCodes(argument); // 注意:这里的强制转换是unchecked操作,编译时会有警告 return (T) code[0][0]; }
调用方式示例:
// 获取Boolean类型结果 Boolean flag = getValue("flagArgument"); // 获取Integer类型结果 Integer number = getValue("numberArgument"); // 获取String类型结果 String text = getValue("textArgument");
这种写法最简洁,但由于Java泛型的类型擦除特性,编译时无法做类型校验,如果REST返回的类型和你期望的不匹配,会在运行时抛出ClassCastException。
方案2:带类型校验的泛型实现(更安全)
如果需要避免运行时类型转换异常,可以传入目标类型的Class对象,提前做类型检查:
private <T> T getValue(String argument, Class<T> targetType) { Object[][] code = restConnector.getCodes(argument); Object result = code[0][0]; // 先校验类型是否匹配 if (targetType.isInstance(result)) { return targetType.cast(result); } // 类型不匹配时抛出明确异常 throw new IllegalArgumentException( String.format("返回结果类型不匹配:期望%s,实际%s", targetType.getName(), result != null ? result.getClass().getName() : "null") ); }
调用方式示例:
Boolean flag = getValue("flagArgument", Boolean.class); Integer number = getValue("numberArgument", Integer.class); String text = getValue("textArgument", String.class);
这种写法会在类型不匹配时立刻抛出带有明确信息的异常,便于排查问题,同时消除了编译时的unchecked警告。
额外注意点
- 如果需要支持基本类型(如
int、boolean),可以额外重载方法,或者直接使用对应的包装类(Integer、Boolean),避免自动拆箱时的NullPointerException。 - 若REST接口可能返回
null,可以在方法里增加null判断逻辑,根据业务需求返回默认值或抛出异常。
内容的提问来源于stack exchange,提问作者w97802
相关产品推荐
相关产品推荐

