我正在使用scalap来分离有关Scala类的信息。适用于案例类,但我想看看一个类是否是一个值类。到目前为止,我还没有找到任何可以告诉我的信息。有人知道如何区分价值类和非价值类吗?
答案 0 :(得分:4)
$ cat ValueClass.scala
class ValueClass(val s: String) extends AnyVal {
def rcap = s.reverse.toUpperCase
}
$ scalap -cp . ValueClass
final class ValueClass extends scala.AnyVal {
val s : scala.Predef.String = { /* compiled code */ }
def this(s : scala.Predef.String) = { /* compiled code */ }
def rcap : java.lang.String = { /* compiled code */ }
override def hashCode() : scala.Int = { /* compiled code */ }
override def equals(x$1 : scala.Any) : scala.Boolean = { /* compiled code */ }
}
object ValueClass extends scala.AnyRef {
def this() = { /* compiled code */ }
final def rcap$extension($this : ValueClass) : java.lang.String = { /* compiled code */ }
final def hashCode$extension($this : ValueClass)() : scala.Int = { /* compiled code */ }
final def equals$extension($this : ValueClass)(x$1 : scala.Any) : scala.Boolean = { /* compiled code */ }
}
第一行给出它,没有?:最终类ValueClass扩展 scala.AnyVal
编辑:如果你没有使用scalap而你想在运行时这样做,你可以(非常hackishly)
class V(val v: Int) extends AnyVal {}
reflect.runtime.universe.typeOf[V].typeSymbol.companionSymbol.
typeSignature.members.exists(_.name.toString.endsWith("$extension"))
至少现在。也许在将来会有一个更容易抓住的isValueClass
旗帜。