17

ScalaとJavaの間でコンパイルの問題が発生しています。

私のJavaコードには

java.util.Map<Double, java.lang.Iterable<Foo>>

私のscalaコードには

Map[Double, Vector[Foo]]

コンパイルエラーが発生します:

error: type mismatch;
found   : scala.collection.immutable.Map[scala.Double,Vector[Foo]
required: java.util.Map[java.lang.Double,java.lang.Iterable[Foo]]

VectorをIterableに暗黙的に変換できる場合でも、scala.collection.JavaConversionsはネストされたコレクションには適用されないようです。Scalaコレクションを繰り返し処理して手動で変換する以外に、型を機能させるためにできることはありますか?

4

5 に答える 5

7

scala.collection.JavaConversions私見を非推奨にする必要があります。を使用して、変換がいつどこで行われるかを明示することをお勧めしscala.collection.JavaConvertersます。あなたの場合:

import scala.collection.JavaConverters._

type Foo = Int // Just to make it compile
val scalaMap = Map(1.0 -> Vector(1, 2)) // As an example

val javaMap = scalaMap.map { 
  case (d, v) => d -> v.toIterable.asJava
}.asJava
于 2012-12-20T23:30:19.803 に答える
4

私はこの汎用関数を作成しました。これは私のニーズに適しています。

def toJava(x: Any): Any = {
  import scala.collection.JavaConverters._
  x match {
    case y: scala.collection.MapLike[_, _, _] => 
      y.map { case (d, v) => toJava(d) -> toJava(v) } asJava
    case y: scala.collection.SetLike[_,_] => 
      y map { item: Any => toJava(item) } asJava
    case y: Iterable[_] => 
      y.map { item: Any => toJava(item) } asJava
    case y: Iterator[_] => 
      toJava(y.toIterable)
    case _ => 
      x
  }
}
于 2015-09-03T16:01:40.127 に答える
0

spark-scala で解決策を探している人は、これを試してください。

org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema をインポートします

ここで、y はネストされた WrapperArray です

y match {
          case x : WrappedArray[x] =>
             (x.map(f => f match {case z: GenericRowWithSchema => z.mkString(",").toString()
                                                case z:Any => z  })).asJavaCollection
          case _ => row.get(i).asInstanceOf[Object]
        }

上記のコードは、次の 2 つのことを行います。1) ラッパー配列がプリミティブ データ型の場合、条件 case_ が通過します。2) ラッパー配列が複合データ型 (struts など) の場合、case GenericRowWithSchema が実行されます。

于 2017-12-28T12:06:03.343 に答える