4

私はscala.collection.immutable.HashMap<A,B>いくつかのJavaコードから使用しており、Scalaネイティブの方法toArray()を使用して、マップの内容(または値)を配列に変換したいと考えています。

私は現在JavaConversions.asMap()etcを使用していて、従来の、しかし醜いJavatoArray(T[])メソッドを使用していますが、代わりにScala組み込みメソッドを直接呼び出すことを好みます。

これはJavaから実行する必要があります。Scalaでコードを書き直すことはオプションではありません。

Scala2.9.1を使用しています。

4

4 に答える 4

2

ClassManifest配列型にを指定する必要がありますT。これは、のコンパニオンオブジェクト(注を参照)から入手できますClassManifest。それで:

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

この例でTは、は実際の型です(型パラメーターではありません)。したがって、たとえば、の場合itrは、Seq[String]これを使用します。

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

ScalaMapは実際にはタプルの集まりなので、次のように使用します。

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

もちろん、これにより、キーと値のタイプとそれぞれTuple2[]にではなく、が与えられます。Javaランドにいるので、生のタイプをキャストできますTuple2<K,V>[]KV


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

ManifestAPIドキュメントから判断すると、タイプ(またはArrayTagバージョンによってはの引数)の引数をに指定する必要があるようですtoArray

于 2012-05-14T15:11:00.210 に答える
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());
  }
}

Class<Tuple2<String,String>>最初にインスタンス化せずにJavaで取得する方法がわかりません。ScalaclassOf[...]ではJavaに同等のものがありますか?

于 2012-05-14T15:49:29.047 に答える