有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

arraylist使用Java HashMap多类型

我正在使用哈希映射作为内存缓存。基本上,这就是我所拥有的:

private static final Map<String, Object> lookup = new HashMap<String, Object>();

    public static Object get(CacheHelper key) {
        return lookup.get(key.getId());
    }

    public static void store(CacheHelper key, Object value) {
        lookup.put(key.getId(), value);
    }

没关系。但对于我从地图上“得到”的每一个物体,我都必须投下,这非常难看。 我想把ArrayList和许多其他不同的东西放进去

有人知道其他类型安全的解决方案吗

(当然,我可以为每种类型创建一个getter和setter,但这是唯一的解决方案吗

那么,有没有更好的方法来创建内存缓存,或者有人知道如何包装hashmap以提高安全性


共 (1) 个答案

  1. # 1 楼答案

    这个get需要一个Class<T>,因为类型擦除,强制转换(T)是一个没有意义的禁止操作

    要么一路融入课堂;每类ID:

    private final Map<Class<?>, Map<String, Object>> lookup = new HashMap<>();
    
    public <T> T get(Class<T> klass, String id) {
        Map<String, Object> mapById = lookup.get(klass);
        if (mapById == null) {
            return null;
        }
        Object value = mapById.get(id);
        return klass.cast(value);
    }
    
    public <T> void store(Class<T> klass, String id, T value) {
        Map<String, Object> mapById = lookup.get(klass);
        if (mapById == null) {
            mapById = new HashMap<>();
            lookup.put(klass, mapById);
        }
        mapById.put(id, value);
    }
    

    不使用值的store。getClass()允许通过接口或基类获取:

    store(Number.class, "x", 3.14);
    store(Number.class, "x", 3);
    store(Number.class, "x", new BigDecimal("3.14"));
    

    或者只做

    public static <T> T get(Class<T> klass, String id) {
        Object value = lookup.get(id);
        return klass.cast(value);
    }
    

    (为了读者,我简化了原始代码。)