1

мне нужно использовать Java-унаследованного кода со следующим способом:Использование java.util.Map от Scala

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 required: java.lang.Object Примечание: примитивные типы неявно не преобразуются в AnyRef. Вы можете безопасно форсировать бокс путем литья x.asInstanceOf [AnyRef].

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

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

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

ответ

8

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

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

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

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

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

map += "testme" ~> 'X' 
1
  1. Может быть, вы могли бы использовать прийти неявные преобразования из scala.collection.JavaConversions._ Это позволит вам SCALA изменяемых или неизменяемых карты вместо java.util.HashMap

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

2

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

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)