Java 泛型 Map,其值受键的类型参数限制
·
如何使用泛型声明一个映射变量,其中X 的类作为键,X 的相关序列化器作为值?
例如,一个可以包含以下内容的 Map:
K、V
BigDecimal.class、new BigDecimalSerializer()
LocalDate.class、new LocalDateSerializer()
Date.class、new DateSerializer()
public static void main(String[] args) {
// 使用示例
SerializerRegistry registry = new SerializerRegistry();
registry.registerSerializer(BigDecimal.class, new BigDecimalSerializer());
registry.registerSerializer(LocalDate.class, new LocalDateSerializer());
registry.registerSerializer(Date.class, new DateSerializer());
// 获取并使用
Serializer<BigDecimal> bdSerializer = registry.getSerializer(BigDecimal.class);
Serializer<LocalDate> lcSerializer = registry.getSerializer(LocalDate.class);
String result = bdSerializer.serialize(new BigDecimal("123.45"));
String result1 = lcSerializer.serialize(LocalDate.of(2026, 1, 1));
}
// 定义序列化器接口
public interface Serializer<T> {
String serialize(T value);
}
// 具体实现
public static class BigDecimalSerializer implements Serializer<BigDecimal> {
@Override
public String serialize(BigDecimal value) {
return value.toString();
}
}
public static class LocalDateSerializer implements Serializer<LocalDate> {
@Override
public String serialize(LocalDate value) {
return value.toString();
}
}
public static class DateSerializer implements Serializer<Date> {
@Override
public String serialize(Date value) {
return value.toString();
}
}
// 注册表
public static class SerializerRegistry {
private final Map<Class<?>, Serializer<?>> serializers = new HashMap<>();
public <T> void registerSerializer(Class<T> type, Serializer<T> serializer) {
serializers.put(type, serializer);
}
@SuppressWarnings("unchecked")
public <T> Serializer<T> getSerializer(Class<T> type) {
return (Serializer<T>) serializers.get(type);
}
}

更多推荐
所有评论(0)