【发布时间】:2021-12-06 01:08:12
【问题描述】:
我有一个缓存类,我在其中使用了 2 个HashMaps 来保留缓存。
我希望能够在给定key 的类类型的情况下选择正确的地图,以便:
- 如果
key为Long,则从映射longKeyCache中获取值 - 如果
key是String,则从映射stringKeyCache中获取值。
(假设用户只会传入 Long 或 String 键)
为此,我构建了函数getMapToUse。
问题是我必须在没有任何类型限制的情况下将其返回类型清除为 Map。只有这样,函数才能正确编译,并且我可以使用返回的映射将缓存存储在后续代码中 (mapToUse.put(key, value))。
代码有效,但我收到了来自 IDE 的警告 - Raw use of parameterized class 'Map'
有没有办法解决这个警告?提前致谢。
public class CacheManager {
private final Map<Long,String> longKeyCache = new WeakHashMap<>();
private final Map<String,Integer> stringKeyCache = new WeakHashMap<>();
public <K, V> V getCache(K key, Function<K, V> valueLoader) {
Map<K, V> mapToUse = getMapToUse(key);
return Optional.ofNullable(mapToUse.get(key))
// cache miss
.orElseGet(() -> {
V value = valueLoader.apply(key);
mapToUse.put(key, value);
return value;
});
}
// warning: Raw use of parameterized class 'Map'
private <K> Map getMapToUse(K key) {
if (key instanceof Long) {
return longKeyCache;
} else {
return stringKeyCache;
}
}
}
【问题讨论】: