2010-04-16 65 views
45

考虑:如何轻松获得Scala案例类的名称?

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

我怎样才能从one.nametwo.name"SecondCC""FirstCC"

+0

不case类的toString方法有其名称(参数)? – 2010-04-16 22:26:51

+0

'FirstCC.toString'返回''“' – pr1001 2010-04-16 22:29:46

+1

通过你可能是指'one.toString' ... – pr1001 2010-04-16 22:46:13

回答

67
def name = this.getClass.getName 

或者,如果你只想要名,不带包装:

def name = this.getClass.getSimpleName 

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

+17

但是请注意,'getSimpleName'有时会抛出'java.lang.InternalError:格式错误的类名',例如在对象的类上调用它时。 – pr1001 2013-05-22 13:21:00

+1

由于1.5你也可以使用'getCanonicalName' – Benoit 2014-05-22 09:40:52

+4

getSimpleName和getCannonicalName仍然是越野车,有一个持续的票。 https://issues.scala-lang.org/browse/SI-2034(以及重复封闭问题https://issues.scala-lang.org/browse/SI-5425) – Lucas 2014-11-11 15:24:03

11
def name = this.getClass.getName 
+0

谢谢,我不知道'getName'。比'toString'好得多。 – pr1001 2010-04-16 22:43:35

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

这个(2.8-only)方法比'this.getClass.getName'有什么好处? – pr1001 2010-04-16 22:43:05

+5

@ pr1001如果您有它们,它将保留类型参数。 – 2010-04-16 23:40:59

+0

有没有任何方法来检索类名称而不包含它的部分(就像'getSimpleName'的情况一样)?我发现你的答案是非常好的方法来克服java.lang.InternalError:在嵌套对象的情况下出现格式错误的类名异常 – 2014-01-23 14:14:08

17

可以使用的情况下阶级的财产productPrefix

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

one.name 
two.name 

注: 如果传递到斯卡拉2.8延伸的情况下,类已被否决,你必须不能忘记左右父()