Как использовать JCache в Scala? Я получаю ошибку типа компилятора: найдена требуемая строка K

Я изучаю 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)
}

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

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

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


person Damian    schedule 01.11.2009    source источник


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

person Daniel C. Sobral    schedule 01.11.2009
comment
Не повезло, я не могу использовать asInstanceOf, я получаю это во время выполнения: java.lang.ClassCastException: com.google.appengine.api.memcache.stdimpl.GCache не может быть преобразован в java.util.HashMap (я закончил движок приложения) - person Damian; 02.11.2009
comment
Если вы не работаете с движком приложения, вы должны были упомянуть об этом в вопросе, так как это очень актуально. В этом случае вам следует создать небольшой класс на Java для выполнения этого конкретного кода и вызывать его из Scala. - person Daniel C. Sobral; 02.11.2009
comment
Что ж, большое спасибо, я думал, что реализация jcache в движке приложения полностью совместима. Я также думал, что из scala можно использовать любой код Java. - person Damian; 02.11.2009
comment
Любой код Java можно использовать из Scala. У App Engine проблемы с кодом, созданным Scala (в частности, asInstanceOf). - person Daniel C. Sobral; 03.11.2009

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

val map = new HashMap[String, AnyRef]

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

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

val cache: Cache[String, AnyRef] = cacheFactory.getCache(map)
person oxbow_lakes    schedule 01.11.2009
comment
Не решено, используя: val cache: Cache[String, AnyRef] = cacheFactory.getCache(new HashMap[String, AnyRef]) Я получаю ту же ошибку компилятора, что и раньше: найдено: String, требуется: K - person Damian; 01.11.2009
comment
Похоже, что библиотека javax.cache (как описано здесь: java2s.com/Open-Source/Java-Document/6.0-JDK-Modules/jsr107/) неправильно использует дженерики при смешивании параметризованных и необработанных типов. Честно говоря, я не уверен, что scala будет делать с этим (как я уже сказал, необработанные типы недопустимы в scala). Возможно, это устаревшая документация? - person oxbow_lakes; 01.11.2009
comment
Можете ли вы попытаться использовать REPL по запросу? Просто распечатайте результаты CacheManager.getInstance.getCacheFactory — это должно дать вам параметры типа вашего экземпляра кеша. - person oxbow_lakes; 01.11.2009
comment
У меня нет опыта использования интерпретатора scala, я пытаюсь использовать javax.cache.CacheManager.getInstance.getCacheFactory, но получаю сообщение об ошибке: кеш не является членом пакета javax - person Damian; 02.11.2009
comment
@Damian, я предполагаю, что вы не используете консоль с правильными файлами JAR в пути к классам. Предложение Даниэля ниже об использовании cache.asInstanceOf[Map[String, AnyRef]], возможно, вам нужно сделать - person oxbow_lakes; 02.11.2009