Java 两种方法具有相同的擦除,但都不重写另一种方法,即使遵循相同的泛型定义

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

我试图扩展ConcurrentHashMap(只是为了好玩),并注意到以下编译错误声明

两种方法具有相同的擦除,但都不重写另一种方法

公共类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;
}