2011-11-06 117 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

相关问题