Java方法如何返回任意类型类?JSON解析场景下返回泛型的实现问题
现有代码问题
- 方法返回值声明为
Class<?>,但实际返回的是DTO实例对象,类型不匹配会直接编译报错 - 缺少默认返回/异常抛出分支,不符合非void方法的返回值要求
泛型返回实现方案
首先让所有需要返回的DTO类(DeviceInfoDto/OperationTokenDto/UserIDTokenDto/ResultDto)继承同一个空的公共父类BaseResponseDto,再通过泛型限定实现类型安全的返回:
// 公共父类定义,空实现即可 public class BaseResponseDto {} // 各个DTO类继承父类 public class DeviceInfoDto extends BaseResponseDto { // 原有属性不变 } // 其余三个DTO同理继承BaseResponseDto
修正后的解析方法实现:
// Gson是线程安全的,抽成全局静态常量避免重复创建 private static final Gson GSON = new GsonBuilder().create(); public <T extends BaseResponseDto> T parseBody(String responseBody) { JsonObject bodyParsed = JsonParser.parseString(responseBody).getAsJsonObject(); if (bodyParsed.has("OS") && bodyParsed.has("version")) { return GSON.fromJson(bodyParsed, DeviceInfoDto.class); } else if (bodyParsed.has("result") && bodyParsed.has("operationToken")) { return GSON.fromJson(bodyParsed, OperationTokenDto.class); } else if (bodyParsed.has("result") && bodyParsed.has("userUUID")) { return GSON.fromJson(bodyParsed, UserIDTokenDto.class); } else if (bodyParsed.has("result")) { return GSON.fromJson(bodyParsed, ResultDto.class); } throw new IllegalArgumentException("响应内容无法匹配已知类型:" + responseBody); }
使用方式
调用时可以直接用对应类型接收,不会产生强转警告,运行时类型安全:
DeviceInfoDto deviceInfo = parseBody(jsonResponse);
如果不想新增公共父类,也可以将方法返回值改为Object,调用时通过instanceof判断后再强转使用即可。
内容的提问来源于stack exchange,提问作者Víctor Martín
相关产品推荐
相关产品推荐

