我使用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] ^
有人能指出我为什么会出现这样的错误以及我做错了什么?
ENV:
答案 0 :(得分:4)
1
上不是Int with AnyRef
您的问题中的编译错误与Guava没有任何关系。此片段在此处产生相同的错误:
val h = new scala.collection.mutable.HashMap[Int with AnyRef, String]
h(3) = "hello"
println("Get 3: " + h.get(3))
给出
error: type mismatch;
found : Int(3)
required: Int
这是由Int with AnyRef
引起的:由于Int
是AnyVal
的子类型,因此交集Int with AnyRef
为空,根本不存在具有该类型的任何实例。< / p>
问题在于,当您调用.build()
时,scala编译器找不到可用作.build[Int, String]
的版本,因为没有未装箱的整数版本。因此,编译器会推断出.build[AnyRef with Int, String]
,并构建一个不可用的缓存结构。
要避免这种情况,请使用java.lang.Integer
代替Int
。这里编译并运行番石榴15.0 scala 2.11:
import com.google.common.cache._
import java.util.concurrent._
val cache: LoadingCache[java.lang.Integer, String] = CacheBuilder.newBuilder()
.maximumSize(2)
.expireAfterWrite(24, TimeUnit.HOURS)
.build[java.lang.Integer, String](
new CacheLoader[java.lang.Integer, String] {
def load(path: java.lang.Integer): String = {
path + "hello"
}
}
)
cache.put(42, "hello, world")
println(cache.get(42))
它应该与scala Int
无缝协作,因为无论如何scala自动装箱Int
进入java.lang.Integer
。
类似错误的答案: