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)
为什么这样做而第一个样本没有?
这是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的这一部分.