如何在没有强制转换的情况下在具有相同数据类型参数的另一个泛型类(或接口)中使用泛型类(或接口)

时间:2009-11-22 14:30:31

标签: java interface parameters casting generics

我需要保留<TKey key, TValue value>对的Cache类。并且TKey可以是支持Serializable接口的任何类,TValue可以是支持Serializable和我自己的ICacheable接口的任何类。< / p>

还有另一个CacheItem类保持<TKey key, TValue value>对。 我希望Cache类具有void add(CacheItem cacheItem)方法。这是我的代码:

public class Cache<TKey extends Serializable, 
   TValue extends Serializable & ICacheable >
{
 private Map<TKey, TValue> cacheStore = 
     Collections.synchronizedMap(new HashMap<TKey, TValue>());

 public void add(TKey key, TValue value)
 {
  cacheStore.put(key, value);
 }

 public void add(CacheItem cacheItem)
 {   
  TKey key = cacheItem.getKey();
  //Do not compiles. Incompatible types. Required: TValue. Found: java.io.Serializable
  TValue value = (TValue) cacheItem.getValue();
  //I need to cast to (TValue) here to compile
  //but it gets the Unchecked cast: 'java.io.Serializable' to 'TValue'
  add(key, value);
 }
}

在另一个档案中:

public class CacheItem<TKey extends Serializable, 
  TValue extends Serializable & ICacheable>
{
 TKey key;
 TValue value;

 public TValue getValue()
 {
  return value;
 }

 public TKey getKey()
 {
  return key;
 }
}

我有什么办法可以避免施法吗?

5 个答案:

答案 0 :(得分:2)

使您的add方法签名如下所示:

public void add(CacheItem<TKey, TValue> cacheItem)

答案 1 :(得分:2)

    public void add(CacheItem<TKey, TValue> cacheItem) {
    TKey key = cacheItem.getKey();
    TValue value = cacheItem.getValue();
    add(key, value);
}

答案 2 :(得分:2)

您正在使用CacheItem上的原始类型。试试这个签名:

  public void add(CacheItem<TKey, TValue> cacheItem)

这将要求CacheItem具有与Cache相同的通用参数。

答案 3 :(得分:1)

首先,您可以ICacheable扩展Serializable,这样可以简化您的代码。


您是否可以尝试参数化方法添加参数

public class Cache<TKey extends Serializable, 
   TValue extends Serializable & ICacheable >
{
 ...
 public void add(CacheItem<TKey, TValue> cacheItem)
 {   
  TKey key = cacheItem.getKey();
  TValue value = cacheItem.getValue();
  add(key, value);
 }
}

因为CacheItem是一个参数化类,所以对它的大多数引用应该使用参数。 否则,它仍然有未解决的类型,您将面临casts

答案 4 :(得分:0)

我认为你应该改变你的课程,如下所示

public class Cache<TKey extends Serializable, 
   TValue extends Serializable & ICacheable >
{
 private Map<Serializable, Serializable> cacheStore = 
     Collections.synchronizedMap(new HashMap<Serializable, Serializable>());

 public void add(Serializable key, Serializable value)
 {
  cacheStore.put(key, value);
 }

 @SuppressWarnings("unchecked")
public void add(CacheItem cacheItem)
 {   
  Serializable key = cacheItem.getKey();
  //Do not compiles. Incompatible types. Required: TValue. Found: java.io.Serializable
  Serializable value = cacheItem.getValue();
  //I need to cast to (TValue) here to compile
  //but it gets the Unchecked cast: 'java.io.Serializable' to 'TValue'
  add(key, value);
 }

}