在Scala中提供类型类的实例时,使用val或object是否更好?
Scala中的类型类模式涉及定义特征,例如:
trait Show[T] { def show(obj: T): String } 然后,您可以定义此类型类的实例化: object Show { implicit val string = new Show[String] { def show(obj: String): String = obj } implicit object BooleanShow extends Show[Boolean] { def show(obj: Boolean): String = obj.toString } } 为伴随对象中的基本类型定义这些实例化的优点是,无论何时涉及类型类(粗略地),它们都自动在范围内. 在功能上它似乎将实例化定义为隐式val或隐式对象不会发生太大变化. 有区别吗?有一种方式比另一种更好吗? 解决方法
实际上不仅仅是val和object之间的类型名称.
你知道,Scala中的对象就像Java中的单例一样. 无论如何,它们都是val和object. 在Scala REPL中尝试这个. trait Show[T] { def show(obj: T): String } object Show { println("!! Show created") implicit val string = new Show[String] { println("!! string created") def show(obj: String): String = obj } implicit object BooleanShow extends Show[Boolean] { println("!!BooleanShow created") def show(obj: Boolean): String = obj.toString } } 如果仅完成定义,则之后不会执行printlns,因为Show是有效的单例.它尚未创建. 接下来,在Scala REPL中执行Show. scala> Show !! Show created !! string created res0: Show.type = Show$@35afff3b 你看,Show和Show.string中的printlns被调用了,但是Show.BooleanShow中的printlns却没有. 您可以在Scala REPL中执行下一步Show.BooleanShow. scala> Show.BooleanShow !!BooleanShow created res1: Show.BooleanShow.type = Show$BooleanShow$@18e419c5 Show.BooleanShow最后被初始化了.它是一个单身人士,所以很懒惰. 基本上,你的问题与val and object inside a scala class?相同,只是你的val和对象是在一个对象中定义的,但链接的问题试图找到一个类中定义的val和对象,而val中的方法使用反射(但是你的使用覆盖,所以没有反思).隐含的基本上没有区别于它们是什么. 我想你已经知道了类和对象之间的区别.更多信息可以在链接的问题中找到. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |