这是情景。
我们的应用程序有一个非常简单的缓存实现接口,方法类似于Map:
public interface ICache<K, V> {
要添加具体的缓存实现,我们实现了接口并包装了一个缓存框架,如EHCache,Redis,memcached等。例子(事实上,这里的EHCache对这个问题并不重要):
public abstract class EHCacheWrapper<K,V> implements ICache<K, V> {
接下来我们有一个名为AuthenticationCache的EHCacheWrapper实现:
public class AuthenticationCache
extends EHCacheWrapper<AuthenticationCacheKey, AuthenticationCacheEntry> {
到目前为止一切顺利。
AuthenticationCache对象除了EHCacheWrapper或ICache之外还有一些其他方法。我们想要添加的是AuthenticationCache,AuthenticationCacheKey和AuthenticationCacheEntry的接口:
public interface IAuthenticationCacheKey extends Serializable {
public interface IAuthenticationCacheEntry extends Serializable {
public interface IAuthenticationCache extends ICache<IAuthenticationCacheKey,IAuthenticationCacheEntry>{
现在我们有:
public class AuthenticationCache
extends EHCacheWrapper<AuthenticationCacheKey, AuthenticationCacheEntry>
implements IAuthenticationCache {
这给出了编译器错误:
The interface ICache cannot be implemented more than once with different arguments: ICache<AuthenticationCacheKey,AuthenticationCacheEntry> and ICache<IAuthenticationCacheKey,IAuthenticationCacheEntry>
我如何实现我们在此之后的目标?
答案 0 :(得分:4)
由于Type Erasure无法在运行时使用泛型,因此无法区分ICache<K, V>
的两个实现。您需要重新考虑Interface和类层次结构的设计。 IAuthenticationCache
是否真的有必要延伸ICache
?
public interface IAuthenticationCache
//extends ICache<IAuthenticationCacheKey,IAuthenticationCacheEntry>
{ ... }