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));