我有以下使用google集合构建缓存的代码:
val cache = new MapMaker().softValues().expiration(30,
TimeUnit.DAYS).makeComputingMap(
new com.google.common.base.Function[String,Int] {
def apply(key:String):Int ={
1
}
})
我收到以下错误消息:
error: type mismatch;
found : java.lang.Object with
com.google.common.base.Function[java.lang.String,Int]{ ... }
required: com.google.common.base.Function[?, ?]
new com.google.common.base.Function[String,Int] {
^
我想知道为什么这些类型不匹配?
实际代码是:
import com.google.common.collect.MapMaker
trait DataCache[V] {
private val cache = new MapMaker().softValues().makeComputingMap(
new com.google.common.base.Function[String,V] {
def apply(key:String):V = null.asInstanceOf[V]
})
def get(key:String):V = cache.get(key)
}
亲切的问候, 阿里
PS - 我正在使用google-collections v1
答案 0 :(得分:7)
您需要为最终方法调用提供类型参数。您正在浏览原始类型接口,并且scala无法重建类型信息。
val cache = new MapMaker().softValues().expiration(30,
TimeUnit.DAYS).makeComputingMap[String, Int](
new com.google.common.base.Function[String,Int] {
def apply(key:String):Int ={
1
}
})
答案 1 :(得分:1)
以下是否有效?
new com.google.common.base.Function[_,_] {
如果这不起作用,您可能希望保留现在的声明,然后在其后添加: com.google.common.base.Function[_, _]
,如下所示:
val cache = new MapMaker().softValues().expiration(30,
TimeUnit.DAYS).makeComputingMap(
new com.google.common.base.Function[String,Int] {
def apply(key:String):Int ={
1
}
}: com.google.common.base.Function[_, _])
我听说Google的一些东西使用原始类型,这很难与Scala很好地集成。事实上,应该被放逐到地狱,他们来自哪里,但那只是imho。
另外,如果您可以使用-explaintypes
进行编译,我们可能会更好地了解失败的原因。