【问题标题】:Guava cache generics errorGuava 缓存泛型错误
【发布时间】:2017-09-20 07:27:36
【问题描述】:

尝试创建番石榴缓存时出现神奇错误:

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;

import java.util.concurrent.ConcurrentMap;

public class Main {

    private static ConcurrentMap<Long, Object> cache = CacheBuilder
            .newBuilder()
            .build(new CacheLoader<Long, Object>() {
                @Override
                public Object load(Long key) throws Exception {
                    return null;
                }
            }).asMap();

}

java编译错误:

Error:(17, 21) java: C:\JavaWorkspace\untitled\src\...\Main.java:17: incompatible types
found   : java.util.concurrent.ConcurrentMap<java.lang.Object,java.lang.Object>
required: java.util.concurrent.ConcurrentMap<java.lang.Long,java.lang.Object>

番石榴版本是 20.0 java版本是1.6

在使用 java 1.8 和 guava 23.0 时 - 没关系!

问题是我只能使用 1.6 java

【问题讨论】:

  • 我见过的非常神奇的行为

标签: generics guava


【解决方案1】:

您可以使用一些解决方法:

private static LoadingCache<Long, Object> cache = CacheBuilder
        .newBuilder()
        .build(new CacheLoader<Long, Object>() {
            @Override
            public Object load(Long key) throws Exception {
                return null;
            }
        });

private static ConcurrentMap<Long, Object> cacheMap = cache.asMap();

【讨论】:

    【解决方案2】:

    正如您提到的,它适用于 JDK 8,因为 enhancements in type inference 是在 that version 中引入的。

    在 JDK 6 上会出现类型不匹配:

    found   : ConcurrentMap<Object, Object>
    required: ConcurrentMap<Long, Object>
    

    因为没有类型提示就无法推断cache 的类型。

    【讨论】:

    • 在提取附加变量以摆脱问题时,这很令人困惑。并且没有简单的方法可以将 LoadingCache 初始化为开箱即用的地图
    • @Xaerxess 我有一个问题here 我正在使用番石榴,我不确定这些操作是否正常工作所以想看看你是否可以帮助我。
    猜你喜欢
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多