[英]How to call Scala's HashMap.toArray() from Java?
我从一些Java代码中使用scala.collection.immutable.HashMap<A,B>
,并希望使用Scala-native方法toArray()
将映射的内容(或值)转换为数组。
我目前使用JavaConversions.asMap()
等,然后使用传统但丑陋的Java toArray(T[])
方法,但我更愿意直接调用Scala内置方法。
这必须从Java完成。 在Scala中重写代码不是一种选择。
我正在使用Scala 2.9.1。
您需要为数组类型T
提供ClassManifest
。 可以从ClassManifest
的配套对象(参见注释)获得。 所以:
itr.toArray(ClassManifest$.MODULE$.fromClass(T.class));
在此示例中, T
是实数类型(不是类型参数)。 所以例如,如果itr
是一个Seq[String]
,你会使用它;
itr.toArray(ClassManifest$.MODULE$.fromClass(String.class));
因为scala的Map
实际上是一堆元组,你会使用这个:
map.toArray(ClassManifest$.MODULE$.fromClass(Tuple2.class));
当然,这为键和值类型K
和V
分别提供了一个Tuple2[]
,而不是Tuple2<K,V>[]
。 当你在Java-land中时,可以转换原始类型
通过访问静态字段M$.MODULE$
,可以获得类型M
的伴随对象
这应该足够了:
map.toArray(scala.reflect.ClassManifest$.MODULE$.Object);
从API文档来看,似乎您需要提供类型为Manifest
(或ArrayTag
,取决于版本)to toArray
。
从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中是否存在等价物?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.