我使用scala.collection.immutable.HashMap<A,B>
了一些 Java 代码,并希望使用 Scala-native 方法toArray()
将映射的内容(或值)转换为数组。
我目前使用JavaConversions.asMap()
etc,然后使用传统但丑陋的 JavatoArray(T[])
方法,但我更愿意直接调用 Scala 内置方法。
这必须从 Java 完成。用 Scala 重写代码不是一种选择。
我正在使用 Scala 2.9.1。
您需要ClassManifest
为数组类型提供T
. 这可从ClassManifest
. 所以:
itr.toArray(ClassManifest$.MODULE$.fromClass(T.class));
在这个例子中,T
是一个真正的类型(不是一个类型参数)。因此,例如,如果itr
是 a Seq[String]
,您将使用它;
itr.toArray(ClassManifest$.MODULE$.fromClass(String.class));
因为 scalaMap
实际上是一堆元组,所以你会使用这个:
map.toArray(ClassManifest$.MODULE$.fromClass(Tuple2.class));
当然,这为您提供了 a Tuple2[]
,而不是 a分别Tuple2<K,V>[]
用于键和值类型K
和V
。正如您在 Java 领域一样,您可以转换原始类型
M
通过访问静态字段可以获得类型的伴随对象M$.MODULE$
这应该足够了:
map.toArray(scala.reflect.ClassManifest$.MODULE$.Object);
在这种情况下,从 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 中是否有等价物?
Manifest
从 API 文档来看,您似乎需要ArrayTag
向toArray
.