私は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%確信しているので安全ですと思います。
質問:
いずれかのシナリオ私は、暗黙的なビューを実装しています方法を失敗ありますか?
これを改善することができますか、同じ結果を達成してキャスティングを避けるより良い方法がありますか?