Java泛型如何避免接口不能使用不同的参数多次实现

时间:2018-05-04 20:18:28

标签: java generics

这是情景。

我们的应用程序有一个非常简单的缓存实现接口,方法类似于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>

我如何实现我们在此之后的目标?

1 个答案:

答案 0 :(得分:4)

由于Type Erasure无法在运行时使用泛型,因此无法区分ICache<K, V>的两个实现。您需要重新考虑Interface和类层次结构的设计。 IAuthenticationCache是否真的有必要延伸ICache

public interface IAuthenticationCache
//extends ICache<IAuthenticationCacheKey,IAuthenticationCacheEntry>
{ ... }