Java 两种方法具有相同的擦除,但都不重写另一种方法,即使遵循相同的泛型定义
我试图扩展ConcurrentHashMap(只是为了好玩),并注意到以下编译错误声明 两种方法具有相同的擦除,但都不重写另一种方法Java 两种方法具有相同的擦除,但都不重写另一种方法,即使遵循相同的泛型定义,java,caching,concurrency,Java,Caching,Concurrency,我试图扩展ConcurrentHashMap(只是为了好玩),并注意到以下编译错误声明 两种方法具有相同的擦除,但都不重写另一种方法 公共类SimpleCacheImpl2扩展了ConcurrentHashMap{ 公共void put(K键,V数据){//此行编译错误 SoftReference softData=新的SoftReference(数据); super.put(键、软数据); } public V get(K key){//此行出现编译错误 SoftReference softD
公共类SimpleCacheImpl2扩展了ConcurrentHashMap{
公共void put(K键,V数据){//此行编译错误
SoftReference softData=新的SoftReference(数据);
super.put(键、软数据);
}
public V get(K key){//此行出现编译错误
SoftReference softData=super.get(键);
return softData==null?null:softData.get();
}
}
我的目的是使用SoftReference来获取数据。有没有关于创建简单缓存的建议
编辑1:
根据Boris&Pshemo的建议,我将继续执行以下实现,以调整和介绍我的功能。仅显示基本功能,并将扩展更多类似的自定义功能
public class SimpleCacheImpl2<K, V> extends ConcurrentHashMap<K,SoftReference<V>> {
@Override
public SoftReference<V> put(K key, SoftReference<V> data){
return super.put(key, data);
}
@Override
public SoftReference<V> get(Object key){
return super.get(key);
}
public V putItem(K key, V data){
SoftReference<V> softData = put(key,new SoftReference<>(data));
return softData.get();
}
public V getItem(K key){
SoftReference<V> softData = get(key);
return softData != null ? softData.get() : null;
}
公共类SimpleCacheImpl2扩展了ConcurrentHashMap{
@凌驾
公共软参考输入(K键,软参考数据){
返回super.put(键、数据);
}
@凌驾
公共软引用获取(对象密钥){
返回super.get(key);
}
公共V项(K键,V数据){
SoftReference softData=输入(键,新的SoftReference(数据));
返回softData.get();
}
public V getItem(K键){
SoftReference softData=获取(键);
return softData!=null?softData.get():null;
}
}您遇到了类型擦除,您的方法与父类中声明的方法冲突,但只有在删除了genetics之后才会发生冲突。您需要使用完全相同的签名来重写父类方法。(是的,我知道,返回类型covarince等,但不要让事情复杂化)。具体来说,在父级中已经声明了一个
put
方法,它是K,SoftReference
,类似于get
。一个更相关的问题可能是,为什么扩展ConcurrentHashMap
?这是一个典型的情况,您应该更喜欢组合而不是继承。扩展ConcurrentHashMap
是必须的吗?您是否计划让用户使用您的类作为ConcurrentHashMap
的表示,例如,当我们有void foo(ConcurrentHashMap)
时,用户是否应该能够像foo(new simpleCacheImp2())一样将SimpleCacheImpl2
传递给它代码>?无论如何,通过扩展ConcurrentHashMap
您的类还继承了public V put(K键,SoftReference值)
方法,您可能不希望在类API中使用该方法(顺便说一句,正是该方法导致了第一次编译错误)。这是不扩展它而使用组合的另一个原因,就像classyourclass实现Map{private ConcurrentHashMap data=new ConcurrentHashMap();@override public V put(K key,V value){data.put(key,new SoftReference(value);}…}
感谢大家的回复并向我展示了一些想法。是的,我最初尝试使用Composition,因为它是标准模式,但是,我希望能有一些调整功能,并通过扩展提供的特性来创建Custome ConcurrentHashMap。现在,我已经纠正了put and get方法的重写实现,以符合generic signature。此外,还引入了一个自定义getItem和putItem方法来调整我的自定义功能。我希望,这会起作用。否则,我肯定会继续合成:)
public class SimpleCacheImpl2<K, V> extends ConcurrentHashMap<K,SoftReference<V>> {
@Override
public SoftReference<V> put(K key, SoftReference<V> data){
return super.put(key, data);
}
@Override
public SoftReference<V> get(Object key){
return super.get(key);
}
public V putItem(K key, V data){
SoftReference<V> softData = put(key,new SoftReference<>(data));
return softData.get();
}
public V getItem(K key){
SoftReference<V> softData = get(key);
return softData != null ? softData.get() : null;
}