scala – 如何为类级别的隐式参数提供默认值
发布时间:2020-12-16 09:19:52 所属栏目:安全 来源:网络整理
导读:我正在尝试使用一些隐式参数定义一个类: object Greetings { def say(name: String)(implicit greetings: String): String = greetings + " " +name } 我从另一个类使用这个类 implicit val greetings = "hello" // greetings : java.lang.String = helloGr
我正在尝试使用一些隐式参数定义一个类:
object Greetings { def say(name: String)(implicit greetings: String): String = greetings + " " +name } 我从另一个类使用这个类 implicit val greetings = "hello" //> greetings : java.lang.String = hello Greetings.say("loic") //> res0: String = hello loic Greetings.say("loic")("hi") //> res1: String = hi loic 我的问题是,只有在我的Greetings对象外部定义隐式val时,它才起作用. 所以我想这样做,但它不工作(隐含值找不到): object Greetings { implicit val greetings = "hello" def say(name: String)(implicit greetings: String): String = greetings + " " +name } 接着 Greetings.say("loic") Greetings.say("loic")("hi") 我知道我可以用(隐含的问候语:String =“hello”)定义一个默认值,但是我想在类级别这样做,以避免重复,如果有很多方法. 我想我缺少一些东西,因为我看到CanBuildFrom是在List类中定义的. 解决方法
在隐式中使用像String这样的一般类型是一个坏主意.
主要原因是隐式查找完全基于类型,那么如果别人定义了类型为String的另一个隐式值呢?你可能会遇到冲突.所以你应该为自己的目的定义你自己的特定类型(一个简单的包装String). 另一个原因是,当查找隐含值时,编译器会将(等于其他位置)查找到隐含值类型的伴随对象(如果有的话).你可以很容易地看到它是多么有用,因为伴侣对象是放置默认隐式值的自然的地方(如你的情况).但是,如果隐式值是您不拥有的类型(例如String),则您无法为其编写一个随播对象,而使用自己的包装器类型则没有问题. 好的,足够的语气,这里是你可以做到的: case class Greetings( value: String ) { override def toString = value } object Greetings { // this implicit is just so that we don't have to manually wrap // the string when explicitly passing a Greetings instance implicit def stringToGreetings( value: String ) = Greetings( value ) // default implicit Greetings value implicit val greetings: Greetings ="hello" def say(name: String)(implicit greetings: Greetings): String = greetings + " " +name } Greetings.say("loic") Greetings.say("loic")("hi") (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |