番石榴缓存通用加载缓存
Guava Cache Generic LoadingCache
我正在尝试使用 scala 创建一个通用的 LoadingCache 并编写了以下代码 -
trait GuavaCache[K, V] {
val maxSize = 1000
val expirationTime = 10
val expirationTimeUnit = TimeUnit.MINUTES
def loadKey(k: K): V
lazy val cache: LoadingCache[K, V] = CacheBuilder.newBuilder()
.maximumSize(maxSize)
.recordStats()
.expireAfterWrite(expirationTime, expirationTimeUnit)
.build(new CacheLoader[K,V] {
override def load(key: K): V = loadKey(key)
})
}
但是编译不了上面的代码,提示错误为-
Error:(18, 6) overloaded method value build with alternatives:
[K1 <: Object, V1 <: Object]()com.google.common.cache.Cache[K1,V1] <and>
[K1 <: Object, V1 <: Object](x: com.google.common.cache.CacheLoader[_ >: K1, V1])com.google.common.cache.LoadingCache[K1,V1]
cannot be applied to (com.google.common.cache.CacheLoader[K,V])
.build(new CacheLoader[K,V] {
然而,大多数博客文章也建议仅以相同的方式进行,https://commitlogs.com/2017/03/11/caching-predictive-models-using-guava-in-scala/
Scala 版本 - 2.12
Guava 版本 - “27.0-jre”
该错误很难诊断,但有一个简单的修复方法。您需要声明您的 K 和 V 继承自 Object (java.lang.object)。所以修复很简单:
trait GuavaCache[K <: Object, V <: Object] { ...
我正在尝试使用 scala 创建一个通用的 LoadingCache 并编写了以下代码 -
trait GuavaCache[K, V] {
val maxSize = 1000
val expirationTime = 10
val expirationTimeUnit = TimeUnit.MINUTES
def loadKey(k: K): V
lazy val cache: LoadingCache[K, V] = CacheBuilder.newBuilder()
.maximumSize(maxSize)
.recordStats()
.expireAfterWrite(expirationTime, expirationTimeUnit)
.build(new CacheLoader[K,V] {
override def load(key: K): V = loadKey(key)
})
}
但是编译不了上面的代码,提示错误为-
Error:(18, 6) overloaded method value build with alternatives:
[K1 <: Object, V1 <: Object]()com.google.common.cache.Cache[K1,V1] <and>
[K1 <: Object, V1 <: Object](x: com.google.common.cache.CacheLoader[_ >: K1, V1])com.google.common.cache.LoadingCache[K1,V1]
cannot be applied to (com.google.common.cache.CacheLoader[K,V])
.build(new CacheLoader[K,V] {
然而,大多数博客文章也建议仅以相同的方式进行,https://commitlogs.com/2017/03/11/caching-predictive-models-using-guava-in-scala/
Scala 版本 - 2.12 Guava 版本 - “27.0-jre”
该错误很难诊断,但有一个简单的修复方法。您需要声明您的 K 和 V 继承自 Object (java.lang.object)。所以修复很简单:
trait GuavaCache[K <: Object, V <: Object] { ...