scala - Symbol 是一个案例对象吗?

标签 scala scala-reflect

{ 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,但如果将密封特征定义为依赖类型,那将不起作用。

最佳答案

Symbol#isModuleClass 看起来可以判断符号是否是一个objectfoo.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 也应该有效,但它只为 companionSymbol 返回 true。

案例测试:

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

关于scala - Symbol 是一个案例对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42677726/

相关文章:

scala - 在 Spark 中处理超过 3GB 的记录大小

scala - 如何 "contramap"akka-streams 接收器

scala - 通过字符串反射定义spark udf

class - Scala:基于类型过滤

eclipse - 使用google guava错误-不在公共(public)后缀: display_url下

scala - Trees$Literal(反射)在 Scala 2.13.0-M3 中移动了吗?

scala - 从 Seq[T] 中提取类型 T

java - 实例化参数类型的空对象

scala - 如何获取传递给 Scala 宏的参数的运行时值?

android - Android 上的 Akka