2015-08-28 24 views
2

This本質上是我的問題,但接受的答案在返回它們的符號而不是案件對象本身時停止。獲取從Scala中的密封父項派生的案例對象實例

從理論上講,這應該是很容易:

def getCaseObjects(enumType: Type) = { 
    val m = ru.runtimeMirror(getClass.getClassLoader) 
    enumType.typeSymbol.asClass.knownDirectSubclasses map { subclass => 
     val enumObjMirror = m.reflectClass(subclass.asClass.toType.typeSymbol.asClass) 
     enumObjMirror.reflectConstructor(subclass.asClass.toType.decl(ru.termNames.CONSTRUCTOR).asMethod)() 
    } 
} 

而這個作品!

......除了它們與Parent密封特徵中包含的實例相比,它們是全新的實例; hooray,我打破了「案件對象是單身」的假設!

我可以在我的Parent密封特質覆蓋equalshashCode並用它做,但我更喜歡的方式來獲得那些特定對象的情況下,而不是那些碰巧看起來像他們一樣。這可能嗎?如果這有什麼不同,我在2.11。

回答

2

假設你使用sealedDescendants方法,您引用的帖子,我相信你應該能夠得到底層object就像:

import scala.reflect.runtime.universe._ 
import scala.reflect.runtime.{ universe => ru } 
val m = ru.runtimeMirror(getClass.getClassLoader) 

val descendants = sealedDescendants[Parent] getOrElse Set.empty 

val objects = descendants.map({ desc => 
    val mod = m.staticModule(desc.asClass.name.decoded) 
    m.reflectModule(mod).instance 
}) 
+0

點上!非常感謝你。 – helgridly

相關問題