2017-03-08 88 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 
相关问题