Java泛型:如何根据参数动态确定方法返回类型?
解决方案:让泛型枚举绑定类型信息
核心思路
通过将Key枚举改造为泛型枚举,让每个枚举常量与对应的预期类型在编译期建立绑定关系,这样就能在get方法中利用这个类型信息安全地转换返回值,实现调用时无需显式转型的效果。
改造后的代码实现
1. 泛型版本的Key枚举
public enum Key<T> { RED(String.class), GREEN(Integer.class), BLUE(Short.class); private final Class<T> expectedType; Key(Class<T> expectedType) { this.expectedType = expectedType; } public Class<T> getExpectedType() { return expectedType; } }
2. 类型安全的Cache类
public class Cache { private static final Map<Key<?>, Object> cache = new HashMap<>(); // 存入时强制类型匹配,编译期即可检查 public <T> void put(Key<T> key, T value) { // 可选:运行时再次校验类型,避免反射等非常规方式存入错误类型 if (!key.getExpectedType().isInstance(value)) { throw new IllegalArgumentException("Value type mismatch for key " + key + ": expected " + key.getExpectedType().getName() + ", got " + value.getClass().getName()); } cache.put(key, value); } // 获取时利用枚举的类型信息安全转换 @SuppressWarnings("unchecked") public <T> T get(Key<T> key) { Object value = cache.get(key); // 借助Class.cast()方法做类型转换,运行时会校验类型合法性 return key.getExpectedType().cast(value); } }
调用示例
public class Main { public static void main(String[] args) { Cache cache = new Cache(); cache.put(Key.RED, "hello"); cache.put(Key.GREEN, 123); // 无需显式转型,编译器自动推导返回类型 String redValue = cache.get(Key.RED); Integer greenValue = cache.get(Key.GREEN); System.out.println(redValue); // 输出 hello System.out.println(greenValue); // 输出 123 } }
方案优势
- 编译期类型检查:
put方法通过泛型约束,确保存入的值类型与Key的预期类型一致,从源头避免类型错误。 - 调用简洁:获取值时无需手动转型,编译器会根据传入的
Key自动推导返回类型。 - 运行时安全:
Class.cast()方法会在运行时校验类型,若出现不匹配会抛出ClassCastException,比直接强制转型更可靠。
内容的提问来源于stack exchange,提问作者toddg
相关产品推荐
相关产品推荐

