Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分配Scala';具有任何类型的映射到Java变量_Java_Scala - Fatal编程技术网

分配Scala';具有任何类型的映射到Java变量

分配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

我有一个类型为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_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