分配Scala';具有任何类型的映射到Java变量
我有一个类型为Map[String,Any]的Scala变量分配Scala';具有任何类型的映射到Java变量,java,scala,Java,Scala,我有一个类型为Map[String,Any]的Scala变量 object Maps { var no_string: Map[String, Any] = Map( ... 我还有一个Scala方法,它使用这个类型作为参数 def generateContext(rep: Map[String, Any], m: Int, k: Int, q: Int) : Array[Byte] 在Java中,我可以使用以下类型调用该方法 wifi.generateContext(Maps.no
object Maps
{
var no_string: Map[String, Any] = Map(
...
我还有一个Scala方法,它使用这个类型作为参数
def generateContext(rep: Map[String, Any], m: Int, k: Int, q: Int) : Array[Byte]
在Java中,我可以使用以下类型调用该方法
wifi.generateContext(Maps.no_string(), m, k, q);
那么,如何将映射.no_string()
存储到Java变量中?换句话说,我需要使用什么类型来存储它们
Map(???)[String, Any(???)] x = Maps.no_string();
使用IntelliJ,我有太多的选项,我只选择了
scala.collection.immutable.Map
,但我不知道如何设置Any
Java中不存在任何
;这是scala特有的类型。Java的Map
只能有Object
值(对应于scala的AnyRef
),而不是原语,因此您需要进行更仔细的转换:
val m = Map[String, Any]("a" -> 1, "b" -> "two")
import scala.collection.JavaConverters._
val javaMap: java.util.Map[String, java.lang.Object] =
m.mapValues {
case x: AnyRef => x: java.lang.Object
case x: Int => Integer.valueOf(x)
// etc for other primatives...
}.asJava
您需要将其“转换”为Map[String,AnyRef]
,它对应于scala.collection.immutable.Map
:
泛型类型的装箱在Scala中作为Java原语类型自动完成,因为JVM的任何类型T
都会被转到(擦除)对象
除此之外,scala.collection.immutable.Map
无需任何显式转换即可工作:
//Scala
class A {
val a = Map[String, Any]("a" -> 1) //it's `Any` but fits to AnyRef/Object
}
//Java
public class B {
public static void main(String[] args) {
A a = new A();
scala.collection.immutable.Map<String, Object> map = a.a(); //it's AnyRef/Object and btw fits only to AnyRef if you'd try to use it from Scala
System.out.println("Hello World!" + map.apply("a"));
}
}
显然,scala将Any
(确切地说是正式的Any
类型-而不是子类型)和AnyRef
表示为Java的对象
,但反之亦然(Java的对象
仅表示为AnyRef
)。形式的Int
类型可以用Int
或Integer
等表示
关于scala对泛型的自动装箱(例如,如果传递给泛型,泛型内部的Int
将始终表示为装箱的Integer
)——唯一的例外是专用方法,但它们只生成额外的重载非装箱实现,因此来自Java的调用无论如何都应该是安全的(将选择获取/返回AnyRef
的方法)
//Scala
class A {
val a = Map[String, Any]("a" -> 1) //it's `Any` but fits to AnyRef/Object
}
//Java
public class B {
public static void main(String[] args) {
A a = new A();
scala.collection.immutable.Map<String, Object> map = a.a(); //it's AnyRef/Object and btw fits only to AnyRef if you'd try to use it from Scala
System.out.println("Hello World!" + map.apply("a"));
}
}
Hello World!1