2012-07-02 42 views
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什麼是最斯卡拉方法來獲得所有childrenMyClass,存儲在childrenArrayList這樣我就可以調用普通的boom方法了嗎?

我的嘗試是:

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

這是一個正確的做法?它會選擇MyClass的所有孩子嗎?這就是Scala的正確方法,還是我必須說一些關於類型邊界的內容?

回答

4

結賬GenTraversableLike.collect。它的簽名基本上是Traversable[A].collect[B <: A](f: A ~> B): Traversable[B],也就是說,它需要與A類型的元件和部分功能fAB的集合,並返回靜態元件型B,其中BA亞型的集合。

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

由於map預計總共功能,你上面的嘗試將情況childrenscala.MatchError失敗不僅包含MyClass實例。你可以通過使用OptionflatMap來解決這個問題,但collect似乎是實現你想要的最斯卡拉方法。

5
import collection.JavaConverters._ 

children.asScala.foreach { 
    case mc: MyClass => mc.boom 
    case _ =>() 
} 
2

我不是一個專家型的,所以我不能確定地說你的解決方案會工作,但它似乎確實應該起作用。它具有簡單明瞭的優點,這總是很好。

雖然你需要添加一個全面的案例(以免得到scala.MatchError)。

case _ => // do nothing 
1

你想collect相關部分:

children.iterator collect { case mc: MyClass => mc } foreach (_.boom())