如何轻松获取Scala案例类的名称?

pr1*_*001 56 scala class classname

鉴于:

case class FirstCC {
  def name: String = ... // something that will give "FirstCC"
}
case class SecondCC extends FirstCC
val one = FirstCC()
val two = SecondCC()
Run Code Online (Sandbox Code Playgroud)

我怎样才能"FirstCC"one.name"SecondCC"two.name

Esk*_*ola 87

def name = this.getClass.getName
Run Code Online (Sandbox Code Playgroud)

或者,如果您只想要没有包的名称:

def name = this.getClass.getSimpleName
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅java.lang.Class的文档.

  • 但请注意,`getSimpleName`有时会抛出`java.lang.InternalError:Malformed class name`,例如在对象的类上调用它时. (19认同)
  • getSimpleName和getCannonicalName仍然有问题,有一张正在进行的票证.https://issues.scala-lang.org/browse/SI-2034(这是一个重复的问题https://issues.scala-lang.org/browse/SI-5425) (4认同)

Pat*_*ick 20

您可以使用productPrefix案例类的属性:

case class FirstCC {
  def name = productPrefix
}
case class SecondCC extends FirstCC
val one = FirstCC()
val two = SecondCC()

one.name
two.name
Run Code Online (Sandbox Code Playgroud)

注意如果您传递给scala 2.8扩展案例类已被弃用,您必须不要忘记左右父 ()


Dan*_*ral 16

class Example {
  private def className[A](a: A)(implicit m: Manifest[A]) = m.toString
  override def toString = className(this)
}
Run Code Online (Sandbox Code Playgroud)

  • @ pr1001如果你有参数,它将保留类型参数. (5认同)

Rex*_*err 11

def name = this.getClass.getName
Run Code Online (Sandbox Code Playgroud)


eje*_*eje 6

这是一个Scala函数,它从任何类型生成一个人类可读的字符串,在类型参数上递归:

https://gist.github.com/erikerlandson/78d8c33419055b98d701

import scala.reflect.runtime.universe._

object TypeString {

  // return a human-readable type string for type argument 'T'
  // typeString[Int] returns "Int"
  def typeString[T :TypeTag]: String = {
    def work(t: Type): String = {
      t match { case TypeRef(pre, sym, args) =>
        val ss = sym.toString.stripPrefix("trait ").stripPrefix("class ").stripPrefix("type ")
        val as = args.map(work)
        if (ss.startsWith("Function")) {
          val arity = args.length - 1
          "(" + (as.take(arity).mkString(",")) + ")" + "=>" + as.drop(arity).head
        } else {
          if (args.length <= 0) ss else (ss + "[" + as.mkString(",") + "]")
        }
      }
    }
    work(typeOf[T])
  }

  // get the type string of an argument:
  // typeString(2) returns "Int"
  def typeString[T :TypeTag](x: T): String = typeString[T]
}
Run Code Online (Sandbox Code Playgroud)


Jav*_*tón 5

def name = getClass.getSimpleName.split('$').head
Run Code Online (Sandbox Code Playgroud)

这将删除$1某些类末尾出现的内容。