2017-10-31 19 views
0

私はJavaライブラリを使用しています。このライブラリには、Scalaコードで暗黙的なビューを持たせたいコレクションがたくさんあります。 Javaライブラリのオブジェクトモデルは、このようなパターンは以下:ScalaのJavaオブジェクトの暗黙的なビューを作成する最適な方法

(NarrowStreet | WideStreet)をストリート TwoNode

StreetList java.util.AbstractList <ストリートを拡張拡張拡張拡張>

ロードリスト java.util.AbstractList <道路>

など。 StreetListは、実質的にはList<Street>のように動作します。

私は、次の署名があるこのライブラリのメソッドを使用する必要があります:Scalaで

List<StreetList> city.getStreets(); 

を、私は暗黙のうちにSeq[Street]コレクションを取得するには次のようにします

implicit def twoNodeView[T <: java.util.AbstractList[_ <: TwoNode]](x : T): Seq[_ <: TwoNode] = for(i <- 0 until x.size()) yield x.get(i) 

私do

city.getStreets.asScala.flatten //.map, .filter, etc. 

それは私にSeq[TwoNode]を与える。私はmapまたはfilter関数でコレクションを使用するときオブジェクトをキャストします。私はこのオブジェクトがであり実際にはSeq[TwoNode]ではないことを100%確信しているので安全ですと思います。

質問:

  1. いずれかのシナリオ私は、暗黙的なビューを実装しています方法を失敗ありますか?

  2. これを改善することができますか、同じ結果を達成してキャスティングを避けるより良い方法がありますか?

答えて

2

これに固有の暗黙的な定義は必要ありません。ちょうどあなたがしたい場合Seq[Street]にネストされたBuffer[Buffer[Street]]、その後.flattenそれを得るために

city.getStreets.asScala.map(_.asScala) 

を使用しています。

関連する問題