加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Scala中提供类型类的实例时,使用val或object是否更好?

发布时间:2020-12-16 18:48:48 所属栏目:安全 来源:网络整理
导读: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 ext
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中的单例一样.
也许你认为string和BooleanShow都在一个对象而不是一个类中,所以它们没有区别,但事实并非如此.

无论如何,它们都是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中的方法使用反射(但是你的使用覆盖,所以没有反思).隐含的基本上没有区别于它们是什么.

我想你已经知道了类和对象之间的区别.更多信息可以在链接的问题中找到.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读