【发布时间】:2018-02-20 19:07:41
【问题描述】:
我正在使用 Scala 代码中的 Google Guava。当我尝试使用 Int 作为示例中的键类型时会出现问题:
CacheBuilder.newBuilder()
.maximumSize(2)
.expireAfterWrite(24, TimeUnit.HOURS)
.build(
new CacheLoader[Int, String] {
def load(path: Int): String = {
path + "hello"
}
}
)
好像没问题,但是推断创建对象的类型是LoadingCache[Int with AnyRef, String]:
val cache: LoadingCache[Int with AnyRef, String] = CacheBuilder.newBuilder()
.maximumSize(2)
.expireAfterWrite(24, TimeUnit.HOURS)
.build(
new CacheLoader[Int, String] {
def load(path: Int): String = {
path + "hello"
}
}
)
当我尝试获取本例中的元素时,会发生错误:
cache.get(1)
Scala 编译器错误:
[ERROR] error: type mismatch;
[INFO] found : Int(1)
[INFO] required: Int
[INFO] cache.get(1)
[INFO] ^
谁能指出为什么会出现这样的错误以及我做错了什么?
环境:
- 谷歌番石榴 15.0
- Scala 2.11.5
【问题讨论】:
-
好的,这显然不适用于
Int with AnyRef。那么...当您将声明替换为val cache: LoadingCache[Int, String] =时会发生什么?在这种情况下发布编译器错误不是更有意义吗?您是否出于某种原因故意写下了“LoadingCache[Int with AnyRef, String]”,还是只是不完善的IDE插入的某种工件? -
如果我将它更改为 LoadingCache[Int, String] 它也不会编译。
-
是的,“它也不会编译”,但它更接近问题的根本原因。我已经在下面解释了这两个问题,您可能对第二部分的解决方案更感兴趣。
-
更高版本的 Scala 和 Guava 仍会出现类似问题:Scala Guava type mismatch issue
标签: scala caching compiler-errors guava google-guava-cache