2017-03-08 148 views
2
{ sealed trait Sealed; case object Foo extends Sealed; case class Bar(s: String) extends Sealed; trait Baz extends Sealed } 
import scala.reflect.runtime.universe._ 
val List(bar, baz, foo) = symbolOf[Sealed].asClass.knownDirectSubclasses.toList 

我試過.asClass.primaryConstructor.isStatic,但是如果密封特徵被定義爲依賴類型,那不起作用。符號是一個案例對象嗎?

+0

現在不能查,但不是模塊做的伎倆?它不會區分對象和案例對象。 –

+0

@ Jasper-M nope。 – Reactormonk

回答

5

Symbol#isModuleClass看起來像它可以確定符號是否爲object,而foo.asClass.isClass可以確定它是否具有大小寫修飾符。請注意,asClass將引發異常,如果您在其他類型的符號上使用它(方法,術語等)。

對象測試

scala> bar.isModuleClass // case class 
res28: Boolean = false 

scala> baz.isModuleClass // trait 
res29: Boolean = false 

scala> foo.isModuleClass // case object 
res30: Boolean = true 

對於其他類型:

scala> val a = "" 
a: String = "" 

scala> symbolOf[a.type].isModuleClass 
res34: Boolean = false 

case class A(value: String) ; object A { def default = A("") } 

scala> symbolOf[A].isModuleClass 
res35: Boolean = false 

scala> symbolOf[A.type].isModuleClass 
res36: Boolean = true 
基於API文檔上

SI-6012似乎isModule也應該工作,但它僅適用於返回true companionSymbol.

案例測試

scala> bar.asClass.isCaseClass // case class 
res44: Boolean = true 

scala> baz.asClass.isCaseClass // trait 
res45: Boolean = false 

scala> foo.asClass.isCaseClass // case object 
res46: Boolean = true 

對於其他類型(定義同上面的例子):

scala> symbolOf[a.type].asClass.isCaseClass // plain singleton object 
res47: Boolean = false 

scala> symbolOf[A].asClass.isCaseClass // case class 
res48: Boolean = true 

scala> symbolOf[A.type].asClass.isCaseClass // non-case object 
res49: Boolean = false 

將其組合在一起

def isCaseObject(symbol: Symbol): Boolean = 
    symbol.isModuleClass && symbol.asClass.isCaseClass 

scala> isCaseObject(bar) 
res50: Boolean = false 

scala> isCaseObject(baz) 
res51: Boolean = false 

scala> isCaseObject(foo) 
res52: Boolean = true 

scala> isCaseObject(symbolOf[a.type]) 
res53: Boolean = false 

scala> isCaseObject(symbolOf[A]) 
res54: Boolean = false 

scala> isCaseObject(symbolOf[A.type]) 
res55: Boolean = false 
相關問題