Используйте 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
)
Может быть, вы могли бы использовать неявные преобразования из
scala.collection.JavaConversions._
Это позволит вам создавать изменяемые или неизменяемые карты вместоjava.util.HashMap
Я не знаю контекст, но, возможно, вы могли бы использовать
"testme" -> "X"
(со строкой)