首页 > 解决方案 > 创建通用对象的缓存

问题描述

我需要创建通用对象的 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>

有什么建议么?

标签: javagenericscaching

解决方案


您尝试做的不是类型安全。
您可以?转换为,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类的泛型。


推荐阅读