使用基于Guava中缓存的映射键入错误

nom*_*el7 1 java generics guava

我正在尝试使用Guava来模拟LRU地图.

Map<K, V> map = CacheBuilder.newBuilder()
        .maximumSize(maxSize)
        .build() // not using a cache loader
        .asMap();
Run Code Online (Sandbox Code Playgroud)

但是当我尝试这样做时,我得到一个错误.

Type mismatch: cannot convert from ConcurrentMap<Object,Object> to Map<K,V>
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用临时引用创建Map,它可以正常工作.

Cache<K, V> cache = CacheBuilder.newBuilder()
        .maximumSize(maxSize)
        .build();
Map<K, V> map = cache.asMap();
Run Code Online (Sandbox Code Playgroud)

为什么这样做而第一个样本没有?

Xae*_*ess 8

这是Java的泛型错误 - 在这种情况下无法推断泛型类型.您应该添加<K, V>告诉Java将新创建的缓存视为Cache<K, V>,而不是Cache<Object, Object>.

private static <K, V> Map<K, V> makeMap(final int maxSize) {
  return CacheBuilder.newBuilder()
      .maximumSize(maxSize)
      .<K, V>build() // not using a cache loader
      .asMap();
}
Run Code Online (Sandbox Code Playgroud)

然后它会工作:

final Map<Long, String> map = makeMap(10);
Run Code Online (Sandbox Code Playgroud)

请参阅Angelika Langer的Java Generics FAQs的这一部分.