java - 创建通用对象的缓存
问题描述
我需要创建通用对象的 Java 缓存。我正在尝试执行以下操作,但这不会编译。
public class Example<T> {
public static class ExampleCache {
private Map<String, Example<?>> cache = new ConcurrentHashMap<>();
public <T> Example<T> getExample(String name) {
return cache.computeIfAbsent(name, k -> new Example<T>());
}
}
}
带有 cache.computeIfAbsent 的行会生成错误
"Error:(16, 35) java: incompatible types: Example<capture#1 of ?> cannot be converted to Example<T>
有什么建议么?
解决方案
您尝试做的不是类型安全。
您可以?
转换为,T
但它不是类型安全的:
return (Example<T>) cache.computeIfAbsent(name, k -> new Example<T>());
您希望客户端决定返回实例getExample()
的通用类型。
假设您添加为条目并且客户端以这种方式调用 : ,他/她将具有不正确的泛型类型,并且可能会在运行时引发一些不一致/异常。Exemple
"hello"-"Example<String>"
getExample()
Example<Integer> example : getExample("hello");
事实上ExampleCache
,它作为输入/输出的泛型类型并不一致。
因此,要么替换通配符T
以定义ExampleCache
特定类型,要么仅Example<?>
在缓存中使用,如在客户端类中,或者仍然不使用Example
类的泛型。
推荐阅读
- excel - 复制并粘贴带有特定子句的单元格
- sql-server - 在 Azure SQL 托管实例中替代 xp_cmdshell 来重命名文件?
- python - Python - 从熊猫数据框中提取以前的日期和其他数据
- ios - 如何在 SwiftUI 中向侧边栏项目添加标签附件
- r - ggplot2/ggsurvplot:“element_text()”的矢量化输入不受官方支持
- java - OffsetDateTime 客户解析器
- java - 在编写机器人代码时可以使用 thread.sleep() 吗?
- java - 在已填充的 Integer ArrayList 中设置值?
- wordpress - 使用 htaccess 永久(301)将所有 url 重定向到主页
- python - 如何在列表中附加列表中的元素?