如何从Java调用Scala的HashMap.toArray()?

时间:2012-05-14 14:17:27

标签: java scala

我使用某些Java代码中的scala.collection.immutable.HashMap<A,B>,并希望使用Scala-native方法toArray()将地图的内容(或值)转换为数组。

我目前使用JavaConversions.asMap()等,然后使用传统但丑陋的Java toArray(T[])方法,但我更愿意直接调用Scala内置方法。

这必须从Java完成。在Scala中重写代码不是一种选择。

我正在使用Scala 2.9.1。

4 个答案:

答案 0 :(得分:2)

您需要为数组类型ClassManifest提供T。这可以从ClassManifest的配套对象(参见注释)中获得。所以:

itr.toArray(ClassManifest$.MODULE$.fromClass(T.class));

在此示例中,T是实数类型(不是类型参数)。例如,如果itrSeq[String],则可以使用此项;

itr.toArray(ClassManifest$.MODULE$.fromClass(String.class));

因为scala的Map实际上是一堆元组,所以你会使用它:

map.toArray(ClassManifest$.MODULE$.fromClass(Tuple2.class));

当然,对于键值和值类型Tuple2[]Tuple2<K,V>[],这分别为K而不是V。当您在Java-land中时,可以转换原始类型

<小时/> 注意从Java 访问配套对象。

通过访问静态字段M可以获得M$.MODULE$类型的随播广告对象

答案 1 :(得分:1)

这应该足够了:

map.toArray(scala.reflect.ClassManifest$.MODULE$.Object);

答案 2 :(得分:0)

从API文档来看,您似乎需要提供类型Manifest(或ArrayTag的参数,具体取决于版本)toArray

答案 3 :(得分:0)

从java调用scala特定方法有时会非常难看,就像在这种情况下一样。我不知道是否有更好的解决方案,但这应该有效:

import scala.collection.immutable.HashMap;

import scala.Tuple2;
import scala.reflect.ClassManifest$;
import scala.reflect.ClassManifest;

public class Foo {
  public static void main(String[] args) {
    HashMap<String,String> map = new HashMap();
    Object ar = map.<Tuple2<String,String>>toArray((ClassManifest<Tuple2<String,String>>)ClassManifest$.MODULE$.fromClass(new Tuple2<String,String>("","").getClass()));
    System.out.println(ar.toString());
  }
}

我不知道Java中如何在不首先实例化的情况下获取Class<Tuple2<String,String>>。在scala中,我会使用classOf[...]在java中是否存在等价物?