在Scala参数化(泛型)类型错误中使用Guava的简单缓存管理器


布偶的表弟派大星丶
2025-03-16 12:21:01 (18小时前)
  1. 我对Scala很新,但仍然不太了解泛型。因此,我无法弄清楚为什么编译器会因类型不匹配错误而讨厌我。

我正在使用谷歌

番石榴
</跨度>
库到库
.build [String,V]()
asScalaConcurrentMap [String,V](cache.asMap())
//})
}
}

基本上,如果我尝试添加

番石榴
</跨度>
缓存到缓存(通过注释掉的)

2 条回复
  1. 0# Gassyc加西可 | 2019-08-31 10-32



    由于在检索缓存时提供类型信息,因此无需尝试和维护通配符键入。将值键入AnyRef然后在结尾处将V形式转换为V要简单得多。以下编译并应该有所帮助。此外,没有必要直接调用asScalaConcurrentMap,因为它很好…隐式。




    1. import scala.collection.JavaConversions._
      import com.google.common.collect.MapMaker
      import java.util.concurrent.TimeUnit
      import com.google.common.cache.CacheBuilder
      import scala.collection.mutable.ConcurrentMap

    2. trait CacheListener // not sure what this is doing yet.

    3. trait CacheManager {

    4. def getCache[V <: AnyRef](
    5.         cacheName: String,
    6.         cacheListener: Option[CacheListener] = None): ConcurrentMap[String, V]
    7. }

    8. class LocalCacheManager extends CacheManager {
      private val caches: ConcurrentMap[String, ConcurrentMap[String, AnyRef]] =
      new MapMaker().concurrencyLevel(4).makeMapString, ConcurrentMap[String, AnyRef]
      def getCacheV <: AnyRef =
      caches.getOrElseUpdate(cacheName, {
      CacheBuilder.newBuilder()
      .concurrencyLevel(4)
      .softValues()
      .expireAfterAccess(30, TimeUnit.MINUTES)
      .asInstanceOf[CacheBuilder[String, AnyRef ]]
      .buildString, AnyRef
      .asMap()
      }).asInstanceOf[ConcurrentMap[String, V]]
      }

    9. </code>

登录 后才能参与评论