我需要保留<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;
}
}
我有什么办法可以避免施法吗?
答案 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);
}
}