Scala 什么是;“覆盖隐式”;什么意思?
我在看一段代码,上面写着Scala 什么是;“覆盖隐式”;什么意思?,scala,Scala,我在看一段代码,上面写着 case class MyClass(override implicit val x : SomeClass) extends SomeOtherClass(...) { ... } 在此上下文中,override implicit是什么意思,如果我想生成一个带有显式参数的MyClass实例,我该怎么办?这意味着SomeOtherClass有一个SomeClass类型的x字段,它将被传递给MyClass的构造函数的x覆盖 implicit将为我的类implic
case class MyClass(override implicit val x : SomeClass) extends SomeOtherClass(...) {
...
}
在此上下文中,
override implicit
是什么意思,如果我想生成一个带有显式参数的MyClass
实例,我该怎么办?这意味着SomeOtherClass
有一个SomeClass
类型的x
字段,它将被传递给MyClass
的构造函数的x
覆盖
implicit
将为我的类implicit
生成x
参数,并允许以下代码:
implicit val someInt = 5
val a = new MyClass
val b = new MyClass()
val c = MyClass() // as it it a case class
如果要生成带有显式参数的MyClass
实例,可以如下显式传递它们:
val a = new MyClass()(42)
(为了简单起见,示例假定SomeClass
是Int
)
澄清一下:这里的
隐式
和覆盖
关键字是不相关的。实际上,还有更多的话要说。我想这是一只虫子trait X{def i:Int}
然后case类C(覆盖隐式vali:Int,j:Int)扩展X
不应该使j
或者i
成为隐式参数,因为隐式在这里是一个LocalModifier,而不是最后一个classparam子句中的前导标记。但这可能只是语法上的折衷<代码>类Y(私有隐式val i:Int,val j:Int)使隐式的作用域看起来错误更加明显j
不是私有的。implicit
始终适用于整个参数列表,并且此参数列表必须是最后一个,这是规则,但查看示例可能不是很直观。在特殊情况下,第一个参数上的修饰符<代码>类Y(private val i:Int,implicit val j:Int)。我不确定您的意思,但在第二个参数中使用implicit不能创建对象,除非您将i
和j
都明确地放置。我建议implicit
,因为修饰符不应该创建隐式参数列表;在我的两个例子中应该是一样的。对于该行为,您应该说classy(隐式覆盖vali:Int)
;这是语法上的另一种产物。