Java 如何将泛型类型存储在缓存中,以避免检索时未经检查的强制转换?
我必须删除其中的一些细节,但基本上我正在尝试缓存一个昂贵的操作的结果,该操作返回一个对象集合,但是这些单独对象的类型在编译时是未知的(只有基类)Java 如何将泛型类型存储在缓存中,以避免检索时未经检查的强制转换?,java,generics,caching,Java,Generics,Caching,我必须删除其中的一些细节,但基本上我正在尝试缓存一个昂贵的操作的结果,该操作返回一个对象集合,但是这些单独对象的类型在编译时是未知的(只有基类) 公共类SomeClass { private static final Map有很多可能的方法来处理这个问题。下面是我要做的-创建一个存储其元素类型的集合类: class TypedList<T> extends ArrayList<T> { private Class<T> type; Type
公共类SomeClass
{
private static final Map有很多可能的方法来处理这个问题。下面是我要做的-创建一个存储其元素类型的集合类:
class TypedList<T> extends ArrayList<T> {
private Class<T> type;
TypedList(Class<T> type) {
super();
this.type = type;
}
Class<T> getType() {
return type;
}
}
class TypedList扩展了ArrayList{
私人阶级类型;
类型列表(类类型){
超级();
this.type=type;
}
类getType(){
返回类型;
}
}
并确保someExpensiveOperation()使用此类返回其结果。这样,在检索缓存项时就可以查询类型。此行为不受直接支持
如果缓存包含单个元素,则可以使用Class.cast()
,在不匹配的情况下,它会抛出ClassCastException
:
private Map<Integer, ?> cache = ...;
public <T> T get(Integer id, Class<T> c) {
return c.cast(cache.get(id));
}
其他方法包括,例如,使用Guava的Collections2.transform()
,创建集合的“选中”视图:
public类Cast实现函数{
私人阶级类型;
公共演员阵容(班级类型){
this.type=type;
}
公共不适用(对象在中){
返回类型.cast(in);
}
}
returncollections2.transform(缓存.get(索引),newcast(类));
这对于静态缓存不有用。
private Map<Integer, ?> cache = ...;
public <T> T get(Integer id, Class<T> c) {
return c.cast(cache.get(id));
}
Collection<T> result = ...;
for (Object o: theCache.get(index))
result.add(theClass.cast(o));
return result;
public class Cast<T> implements Function<Object, T> {
private Class<T> type;
public Cast(Class<T> type) {
this.type = type;
}
public T apply(Object in) {
return type.cast(in);
}
}
return Collections2.transform(theCache.get(index), new Cast<T>(theClass));