implicitly generic def companion classes scala class classname

generic - scala implicit



¿Cómo puedo obtener fácilmente el nombre de una clase de caso Scala? (5)

Aquí hay una función de Scala que genera una cadena legible por humanos de cualquier tipo, recurriendo a los parámetros de tipo:

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] }

Dado:

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

¿Cómo puedo obtener "FirstCC" de one.name y "SecondCC" de two.name ?


Puede usar la propiedad productPrefix de la clase de caso:

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

NB: Si pasas a scala 2.8 extendiendo una clase de caja han sido desaprobados, y no debes olvidar el padre izquierdo y derecho ()


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


def name = this.getClass.getName


def name = this.getClass.getName

O si solo quieres el nombre sin el paquete:

def name = this.getClass.getSimpleName

Consulte la documentación de java.lang.Class para obtener más información.