2010-04-16 61 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延伸的情況下,類已被否決,你必須不能忘記左右父()