2010-01-29 122 views
6
实现一个Java接口

我已经为使用谷歌集合构建缓存下面的代码:在斯卡拉

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 - 我使用谷歌的集合V1

回答

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

请问以下工作?

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[_, _]) 

我听说一些谷歌的东西使用原始类型,这很难与Scala很好地整合。事实上,它们应该被放逐回地狱,它们来自哪里,但那只是imho。

此外,如果您可以用-explaintypes编译,我们可能会得到一个更好的失败概念。

+0

不行的,现在我得到这个错误:需要 类的类型,但com.google.common.base.Function [_,_]发现 新com.google.common.base.Function [ _,_] 我也试过-explaintypes,其实输出真的很难理解: java.lang.Object与com.google.common.base.Function [_,_] 2010-01-29 13:54:59

+0

@Ali:你似乎只是尝试了第一个建议。我现在粘贴了第二个建议的完整代码。另外,请将'-explaintypes'的输出添加到您的问题中。 – 2010-01-29 14:06:14

+0

其实输出很大,我添加了实际的代码,其中一个可以复制粘贴来重现错误消息。请让我知道,如果有什么我会提供。 – 2010-01-29 16:16:19