Используйте java.util.Map из Scala - PullRequest
1 голос
/ 02 февраля 2011

Мне нужно использовать устаревший код 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)

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

несоответствие типов; найдено: Char требуется: 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 ]

8 голосов
/ 02 февраля 2011

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

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'
2 голосов
/ 02 февраля 2011

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

import java.lang.Character

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

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

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

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

...