2011-11-06 122 views
2

例如,我想有這樣的合作,以建立jDName爲「李四」和jDAge到32路:如何爲我的Scala類定義強制轉換和隱式強制轉換操作?

case class Person(name : String, surname : String, age : Int) 

val johnDoe = Person("John", "Doe", 32) 

val jDName : String = johnDoe 

val jDAge : Int = johnDoe 

我可以寫功能,在Person類提供隱式轉換爲字符串, Int和其他(自定義)類型?另外一件事情是顯式演員操作 - 也很有趣,但我不知道我應該如何在Scala中編寫一個例子。

+2

你可以,但這是一個非常糟糕的主意。你有兩個不同類型的字符串,它們不能按類型區分。如果一個人被隱式轉換而另一個不轉換,那會變得非常混亂。 –

回答

4

當然,把它們放在同伴對象中。

scala> case class Person(name : String, surname : String, age : Int); object Person { 
    | implicit def pToString(p: Person) = p.name + " " + p.surname + ", age " + p.age 
    | implicit def pToInt(p: Person) = p.age 
    | } 
defined class Person 
defined module Person 

scala> val johnDoe = Person("John", "Doe", 32) 
johnDoe: Person = Person(John,Doe,32) 

scala> val jDName : String = johnDoe 
jDName: String = John Doe, age 32 

scala> val jDAge : Int = johnDoe 
jDAge: Int = 32 
+0

這個建議如何在沒有夥伴對象的DI世界看起來?所以'case class Person'和'@Singleton case PersonService'? – wwkudu

+0

@wwkudu假設你的意思是動態依賴注入,它沒有。 Implicits是靜態解析的,所以在運行時沒有發生任何變化。 –

7

會這樣嗎?

object Person { 
    implicit def pToString(p: Person) = p.name + " " + p.surname + ", age " + p.age 
    implicit def pToInt(p: Person) = p.age 
} 
import Person._ 
+0

它可能會工作,但我很好奇它是否可以在類中完成(例如在C#中)。 – Ivan

+2

@Ivan你不能把它們放在類中,因爲沒有什麼可以是「靜態的」,所以類中的所有東西都被限制在實例中。你想要的是更通用的範圍。在上面的示例中,這是伴隨對象Person,因此在處理實例類Person時處於範圍內。 –

+1

對不起,伊凡,但你爲什麼把丹尼爾的回答標記爲答案,而不是我的。他們完全一樣,我的第一。好吧! =) – pr1001

相關問題