Используйте java.util.Map из Scala

Мне нужно использовать устаревший код Java с помощью следующего метода:

public void doit(Map <String, Object> vals) {...}

Мой код Scala:

var map = new java.util.HashMap[String, Any]
map += "testme" -> 'X'
doit(map)

урожайность =>

несоответствие типов; найдено: java.util.HashMap[String, Any] требуется: java.util.HashMap[java.lang.String, java.Object]

Поэтому я изменяю это на:

var map = new java.util.HashMap[java.lang.String, Object]
map += "testme" -> 'X'
doit(map)

урожайность =>

несоответствие типов; Найдено: Требуется символ: java.lang.Object Примечание. Примитивные типы неявно не преобразуются в AnyRef. Вы можете безопасно форсировать бокс, применив x.asInstanceOf[AnyRef].

Итак, наконец, я придумал следующее:

var map = new java.util.HashMap[java.lang.String, Object]
map += "testme" -> 'X'.asInstanceOf[AnyRef]
doit(map)

Есть ли более лаконичный способ справиться с этим?

3 ответа

Решение

Там нет встроенного метода, чтобы сделать его короче, но вы можете написать вспомогательный метод:

def jkv(s: String, a: Any) = s -> a.asInstanceOf[AnyRef]

map += jkv("testme",'X')

или используйте шаблон pimp-my-library, чтобы добавить новый оператор, который сделает это за вас

class StringArrow(s: String) {
  def ~>(a: Any) = s -> a.asInstanceOf[AnyRef]
}
implicit def string_has_arrow(s: String) = new StringArrow(s)

map += "testme" ~> 'X'

Используйте тип ascription следующим образом:

import java.lang.Character

var map = new java.util.HashMap[java.lang.String, Object]
map += "testme" -> ('X':Character)
doit(map)

Это говорит Скала, что вы хотите 'X' быть неявно преобразованным в java.lang.Character если это уже не тот. (Это работает, потому что это указывает на более конкретный тип, чем Object)

  1. Может быть, вы могли бы использовать неявные преобразования из scala.collection.JavaConversions._Это позволит вам создавать изменяемые или неизменяемые карты вместо java.util.HashMap

  2. Я не знаю контекст, но, возможно, вы могли бы использовать "testme" -> "X" (со строкой)

Другие вопросы по тегам