java泛型缓存工具类通过声明类型参数,用map存储+class校验实现安全存取:put方法泛型推断自动转object,get方法依赖class运行时强转防classcastexception。

Java 泛型在缓存工具类中实现任意类型存取,核心是用 <t></t> 声明类型参数,并配合 Map<string object></string> 存储 + 运行时类型转换,同时规避泛型擦除带来的 ClassCastException 风险。
用 Map 作为底层存储容器
泛型不能直接用于数组或反射创建实例,但 Object 可以安全接收任意引用类型。缓存本质是 key-value 映射,key 通常为字符串(如业务 ID),value 存任意对象:
- 不使用
Map<string t></string>—— 因为 T 是类型变量,无法在类级别固定; - 使用
private final Map<string object> cache = new ConcurrentHashMap();</string>
- 所有存入值都自动向上转型为
Object,无强制转换开销。
存操作:泛型方法 + 类型无关写入
存数据不需要知道具体类型,只需接受泛型参数并存进 map:
public <t> void put(String key, T value) {
if (key != null) {
cache.put(key, value);
}
}</t>
- 方法签名中的
<t></t>是局部泛型,每次调用自动推断(如put("u1", new User())推出T=User); - 实际存入的是
User实例的引用,被当作Object存储,安全无损; - 无需
Class<t></t>参数,因为写入不涉及类型检查。
取操作:必须传入 Class 用于安全强转
由于泛型擦除,从 Object 取出时无法自动还原类型,必须靠 Class 对象做运行时校验和转换:
public <t> T get(String key, Class<t> type) {
Object obj = cache.get(key);
if (obj == null) return null;
if (type.isInstance(obj)) {
return type.cast(obj); // 安全强转,比 (T) obj 更可靠
}
throw new ClassCastException("Cached object " + obj +
" is not of expected type " + type.getName());
}</t></t>
-
type.isInstance(obj)比obj.getClass() == type更健壮(支持子类、接口实现); -
type.cast()是推荐方式,内部做了空值和类型检查,比裸强制转换更安全; - 调用示例:
User u = cache.get("u1", User.class);,编译期可推断T=User,IDE 有类型提示。
进阶:支持带过期时间的泛型缓存项
若需 TTL(Time-To-Live),可封装一个泛型包装类,避免对每个类型重复存时间戳:
static class CacheEntry<t> {
final T value;
final long expireAt;
CacheEntry(T value, long expireAt) {
this.value = value;
this.expireAt = expireAt;
}
boolean isExpired() {
return System.currentTimeMillis() > expireAt;
}
}</t>
此时缓存 map 改为 Map<string cacheentry>></string>,get 方法中先判断是否过期,再提取 entry.value 并用 Class<t></t> 校验类型。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











