1

私は次の状況にあります:

Java libクラス:

class LibClass {
  ArrayList<LibClass> children;
}

私のプログラムScalaコード:

abstract class MyClass extends LibClass {
  def boom { }
  def boomMyClassInstances  // ???
}

class Lala extends MyClass
class Hoho extends MyClass

問題は、このメソッドで、すべてのをboomMyClassInstances取得するための最もスカラっぽい方法は何ですか?に格納されているので、それらすべてに対して共通のメソッドを呼び出すことができますか?childrenMyClasschildren ArrayListboom

私の試みは:

def boomMyClassInstances {
  children.toArray.map { case mc: MyClass => mc.boom }
}

これは正しいアプローチですか?のすべての子を選択しMyClassますか?これはそのための正しいScalaの方法ですか、それとも型の境界について何かを言わなければなりませんか?

4

4 に答える 4

5
import collection.JavaConverters._

children.asScala.foreach { 
  case mc: MyClass => mc.boom 
  case _ => ()
}
于 2012-07-02T11:57:54.073 に答える
4

チェックアウトしてくださいGenTraversableLike.collect。そのシグネチャは基本的に ですTraversable[A].collect[B <: A](f: A ~> B): Traversable[B]。つまり、 から までの型の要素と部分関数を含むコレクションを受け取り、はのAサブタイプである静的要素型 のコレクションを返します。fABBBA

val myClassInstances: List[MyClass] =
  children.toList.collect{case mc: MyClass => mc}

map合計関数が必要なため、上記の試行は のインスタンスだけが含まれていない場合に失敗しscala.MatchErrorます。orを使用してこれを回避できますが、目的を達成するための最も Scala っぽい方法のようです。childrenMyClassOptionflatMapcollect

于 2012-07-02T11:55:54.050 に答える
2

私は型の専門家ではないので、あなたのソリューションがうまくいくと断言することはできませんが、うまくいくはずです。それは常に良いことである、簡単であるという利点があります。

ただし、キャッチオールケースを追加する必要があります(取得しないようにscala.MatchError)。

case _ => // do nothing
于 2012-07-02T11:58:25.917 に答える
1

collect関連する部分が必要です:

children.iterator collect { case mc: MyClass => mc } foreach (_.boom())
于 2012-07-02T13:19:32.110 に答える