我正在编写一个HashMap
基于简单的 Cache ,其工作方式如下:
- 如果请求
key
在缓存中,则返回其value
. - 如果请求
key
不存在,则运行value
基于生成的方法key
,存储两者,返回value
。
编码:
import java.util.HashMap;
abstract class Cache<K, V> extends HashMap<K, V> {
@Override
public V get(Object key) {
if (containsKey(key)) {
return super.get(key);
} else {
V val = getData(key);
put((K)key, val); // this is the line I'm discussing below
return val;
}
}
public abstract V getData(Object key);
}
它非常简单并且效果很好。但是,我讨厌Sun 决定get()
将 aObject
作为其论点而不是K
. 我已经阅读了足够多的内容,知道它背后有一些基本原理(我不同意,但这是另一个故事)。
我的问题出在注释行中,因为似乎必须取消选中演员表。由于类型擦除,我无法检查是否key
是类型K
(正确put()
功能所必需的),因此该方法容易出错。
一种解决方案是从“is a”切换到“has a”HashMap
关系,这种关系更好更干净,但由于多种原因Cache
无法实现这种关系。Map
编码:
import java.util.HashMap;
import java.util.Map;
abstract class Cache<K, V> {
private final Map<K, V> map = new HashMap<K, V>();
public V get(K key) {
if (map.containsKey(key)) {
return map.get(key);
} else {
V val = getData(key);
map.put(key, val);
return val;
}
}
public abstract V getData(K key);
}
任何人都可以提出任何其他(甚至是骇人听闻的)解决方案,以便我可以在 and 方面保持Cache
一个并且Map
仍然是类型安全的吗?get(Object key)
put(K key, V val)
我唯一能想到的就是创建另一个名为 ie 的方法getValue(Key k)
,该方法将委托给get(Object key)
,但是我不能强迫任何人使用新方法而不是通常的方法。