2010-01-29 123 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