JJava 知识库
JAVA INTERVIEW

高频面试题

Java基础进阶约 2 分钟

你们封装统一 RPC 返回对象和分页组件时,泛型是怎么设计的?遇到过类型擦除带来的问题吗?

参考回答约 2 分钟 · 口语表达
我的判断

统一返回对象用泛型表达“外壳稳定、载荷变化”,但反序列化边界必须显式保留实际类型,不能把所有数据都退化成 Object。

我通常把协议外壳和业务数据分开:RpcResult<T> 只放错误码、提示、traceId 和 T data;分页再用 PageResult<T> 表达记录、游标或总数。调用方拿到 RpcResult<OrderDTO> 后不需要强转,也不会把分页字段复制到每个接口里。

真正容易踩坑的是 JSON 或缓存反序列化。Java 运行期只看到 RpcResult,看不到里面原本是 OrderDTO 还是 List<OrderDTO>。跨这个边界时我会传入完整类型:

new TypeReference<RpcResult<List<OrderDTO>>>() {}

如果框架层把结果先读成 Map 再到处强转,泛型设计就只剩表面。我的做法是让 HTTP/RPC 客户端在最靠近网络的位置完成类型恢复,业务层只接触确定类型。

另外会控制泛型边界:生产者常用 ? extends T,消费者常用 ? super T,但公共 API 不会堆太多通配符,让调用方根本读不懂。