Как использовать JCache в Scala? Я получаю ошибку типа компилятора: найдена строка, необходимая K - PullRequest
1 голос
/ 01 ноября 2009

Я изучаю Scala и пытаюсь использовать javax.cache в коде Scala и не могу найти, как решить эту проблему:

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)
}

и ошибка компилятора:

ошибка: несоответствие типов
найдено: String
требуется: K
в cache.put (ключ, значение)

Edit:
Как сказал Даниэль, я должен был упомянуть в вопросе, что я перестал работать с приложением, поскольку это кажется весьма актуальным. В этом случае решение состоит в том, чтобы создать небольшой класс в Java для выполнения этого конкретного кода и вызвать его из Scala.

Ответы [ 2 ]

2 голосов
/ 01 ноября 2009

Попробуйте:

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 }), но я не могу вспомнить как (или найти сайт, который объясняет это:).

1 голос
/ 01 ноября 2009

Похоже, проблема заключается в предоставлении правильных общих параметров для HashMap. Я полагаю, вы хотите что-то вроде:

val map = new HashMap[String, AnyRef]

Помните: Scala не позволяет использовать необработанные типы .

Вероятно, будет хорошей идеей использовать REPL , чтобы увидеть, к какому типу Scala относится ваша переменная cache, или предоставить информацию о типе самостоятельно, чтобы увидеть, компилируется ли она OK:

val cache: Cache[String, AnyRef] = cacheFactory.getCache(map)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...