如何将泛型类型存储在缓存中,以避免检索时未经检查的强制类型转换?

亚当·伯利(Adam Burley):

必须删除一些细节,但是基本上,我试图缓存返回对象集合的昂贵操作的结果,但是这些单个对象的类型在编译时未知(只有基类) )。

public class SomeClass
{
    private static final Map<Integer,Collection<? extends SomeBaseClass>> theCache = new HashMap<Integer,Collection<? extends SomeBaseClass>>();

    public <T extends SomeBaseClass> Collection<T> theMethod(Class<T> theClass, int index)
    {
        if (theCache.containsKey(index))
        {
            return (Collection<T>) theCache.get(index);
        }
        else
        {
            Collection<T> result = someExpensiveOperation(theClass, index);
            theCache.put(index, result);
            return result;
        }
    }

    // ...

}

在这里,缓存检索是未经检查的强制转换,因为代码只是相信调用者传递给方法的类参数与先前调用所传递的类参数兼容(应该相同),而先前调用是在缓存中创建对象的首先。

是否有某种方法或某种设计模式可以将实际的类与对象本身一起缓存,以便可以避免这种未经检查的转换?

axtavt:

没有这种行为的直接支持。

如果您的缓存包含单个元素,则可以使用Class.cast()ClassCastException如果不匹配,则抛出

private Map<Integer, ?> cache = ...;

public <T> T get(Integer id, Class<T> c) {
    return c.cast(cache.get(id));
}

对于缓存的集合,它将更加复杂。如果您实际上想避免未经检查的类型转换,则可以创建一个新集合,并通过Class.cast()以下方法进行填充

Collection<T> result = ...;
for (Object o: theCache.get(index)) 
    result.add(theClass.cast(o));
return result;

其他方法包括,例如,使用Guava的创建“检查”集合视图Collections2.transform()

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Java泛型避免未经检查的强制转换警告

如何避免在策略模式中使用Java和泛型进行未经检查的强制转换

如何强制强制转换类型的字典以避免分配中的不兼容类型

有什么方法可以避免在使用泛型参数调用方法时进行类型转换?

如何在Kotlin中的isAssignableFrom检查之后强制转换泛型类型?

从Bundle检索Serializable对象时如何避免收到未经检查的强制转换警告

从Object,泛型类和通配符未经检查的类型转换

如何避免警告类型安全:未经检查就从Object强制转换为ArrayList <Facility>

如何将泛型类型转换为对象?

如何修复不同接口的泛型中的“未经检查的强制转换”

Java泛型:将原始类型转换为任何可更改的类型不会生成未经检查的转换警告

当 T 定义为数组时,如何将对象数组强制转换/转换为泛型类型 T?

IntelliJ中具有泛型类型的未经检查的转换警告

Rust:如何将特定类型转换为泛型类型(所有内置类型)?

如何将特定类型转换为泛型类型(所有内置类型)?

覆盖带有原始类型参数的方法时,是否可以避免未经检查的警告?

变量如何以及何时强制转换为泛型类型参数中声明的类型?

使用泛型类型执行强制转换时的警告

强制转换为泛型类型时的Java警告

在Java中,如何在泛型类型的实例上调用getClass时避免原始类型?

如何将数字类型转换为泛型类型参数?

如何在Swift中向下转换/强制转换结构的泛型类型

Java泛型语法如何帮助避免类型转换?

如何将泛型类型传递到新的泛型对象中?

在C#中强制转换为任何类型的泛型

C#如何在泛型类型实现某些类时强制转换类

Java:反射,泛型和未经检查的强制转换

从通用型未经检查的强制转换为同一类型

使用泛型类型实现 Java 接口类:警告“类型安全:返回类型......需要未经检查的转换才能符合”