我使用某些Java代码中的scala.collection.immutable.HashMap<A,B>
,并希望使用Scala-native方法toArray()
将地图的内容(或值)转换为数组。
我目前使用JavaConversions.asMap()
等,然后使用传统但丑陋的Java toArray(T[])
方法,但我更愿意直接调用Scala内置方法。
这必须从Java完成。在Scala中重写代码不是一种选择。
我正在使用Scala 2.9.1。
答案 0 :(得分:2)
您需要为数组类型ClassManifest
提供T
。这可以从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));
当然,对于键值和值类型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中是否存在等价物?