4

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

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

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

我正在使用 Scala 2.9.1。

4

4 回答 4

2

您需要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>[]用于键和值类型KV。正如您在 Java 领域一样,您可以转换原始类型


注意从 Java 访问伴随对象

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

于 2012-05-14T15:51:42.077 回答
1

这应该足够了:

map.toArray(scala.reflect.ClassManifest$.MODULE$.Object);
于 2012-05-14T16:03:46.787 回答
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 中是否有等价物?

于 2012-05-14T15:49:29.047 回答
0

Manifest从 API 文档来看,您似乎需要ArrayTagtoArray.

于 2012-05-14T15:11:00.210 回答