2009-11-01 43 views
1

我學習Scala,並試圖在Scala代碼使用javax.cache,找不到如何解決這個問題:如何在Scala中使用JCache?我得到的編譯器類型錯誤:找到字符串所需ķ

val cacheFactory = CacheManager.getInstance.getCacheFactory 
val map = new HashMap 
val cache = cacheFactory.createCache(map) 

def rawSet(key:String, value:Array[Byte]) { 
    cache.put(key, value) 
} 

和編譯器錯誤:

error: type mismatch
found: String
required: K
in cache.put(key, value)

編輯:
正如丹尼爾說,我應該說我在App Engine的,因爲這似乎是高度相關的問題提到。在這種情況下,解決方案是在Java中創建一個小類來執行此特定代碼,並從Scala調用它。

回答

2

嘗試:

val cache: Cache[_, AnyRef] = cacheFactory.getCache(new HashMap[String, AnyRef]) 

或甚至Cache[_, _]。您可能需要使用像這樣把價值觀:

cache.asInstanceOf[HashMap[String,AnyRef]].put(key, value) 

我敢肯定是有辦法做到這一點不asInstanceOf,使用完整的語法存在(Cache[T, AnyRef] forSome { type T }),但我不記得如何(或找到解釋它的網站:)。

+0

沒有運氣,我不能使用asInstanceOf,我在運行時得到這個: java.lang.ClassCastException:com.google .appengine.api.memcache.stdimpl.GCache不能轉換爲java.util.HashMap (我是通過應用程序引擎) – Damian 2009-11-02 00:46:41

+0

如果您是通過應用程序引擎,您應該提到在問題中,因爲這是高度相關的。在這種情況下,你應該用Java創建一個小類來完成這個特定的代碼,並從Scala調用它。 – 2009-11-02 03:04:03

+0

好吧,非常感謝,我認爲jcache的應用引擎實現完全兼容。我也認爲* scala可以使用任何* java代碼。 – Damian 2009-11-02 10:02:33

1

該問題似乎是爲HashMap提供正確的通用參數之一。我相信你想要的東西,如:

val map = new HashMap[String, AnyRef] 

記住:斯卡拉不允許使用原料種類的。

它可能使用REPL看什麼類型的Scala已經推斷出你的cache變量是,或自己提供類型的信息,看它是否編譯一個好主意OK:

val cache: Cache[String, AnyRef] = cacheFactory.getCache(map) 
+0

沒有解決,使用: VAL緩存:緩存[字符串,AnyRef] = cacheFactory.getCache(新的HashMap [字符串,AnyRef]) 我得到相同的編譯器錯誤如前:發現:字符串,必需:K – Damian 2009-11-01 17:37:36

+0

它看起來像'javax.cache'庫(如此處所述:http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules/jsr107/javax.cache.htm)嚴重誤用*混合參數化和原始類型的泛型*。說實話,我不確定scala會如何處理這些事情(正如我所說,原始類型在scala中是非法的)。也許這是過時的文件? – 2009-11-01 18:46:44

+0

您可以嘗試按要求使用** REPL **嗎?只是打印出'CacheManager.getInstance.getCacheFactory'的結果 - 這應該會給你緩存實例的類型參數 – 2009-11-01 18:48:03

相關問題