【问题标题】:Determine whether type is singleton via reflection通过反射判断类型是否为单例
【发布时间】:2013-06-06 06:38:11
【问题描述】:

如何判断一个类型是否为单例?

case object Foo
case class Bar(i: Int)

def isSingleton[A](implicit t: reflect.ClassTag[A]): Boolean = ???

assert( isSingleton[Foo.type])
assert(!isSingleton[Bar     ])

【问题讨论】:

    标签: scala reflection


    【解决方案1】:

    您需要ClassTag<:<ClassTag 中已弃用)吗?如果没有,那么它是这样工作的:

    scala> import scala.reflect.runtime.universe._
    import scala.reflect.runtime.universe._
    
    scala> def isSingleton[A : TypeTag] = typeOf[A] <:< typeOf[Singleton]
    isSingleton: [A](implicit evidence$1: reflect.runtime.universe.TypeTag[A])Boolean
    
    scala> isSingleton[Foo.type]
    res5: Boolean = true
    
    scala> isSingleton[Bar]
    res6: Boolean = false
    

    【讨论】:

    • 不,TypeTag 很好。谢谢。
    • 我不确定我是在找错地方还是什么,但我在名为 Singleton 的 Scala API 文档中找不到类型。它住在哪里?
    • @RandallSchulz:它是 Scalas 的“魔法”类型之一。它只存在于编译器中...
    • 我明白了。我想这是一个疏忽,因为其他“合成”类型有 ScalaDoc 条目,即使它们不是从实际编译到 Scala 标准库中的代码派生的。
    【解决方案2】:

    我想添加另一种可能性,这在您处于 Symbol 级别时很有用(例如,降低类型的子类型):

    def isSingleton[A: TypeTag]: Boolean = typeOf[A].typeSymbol.isModuleClass
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      相关资源
      最近更新 更多