scala类构造函数中的隐式

scala类构造函数中的隐式,scala,implicit,Scala,Implicit,我不明白为什么下面三个例子中只有一个有效?是什么使另外两个有缺陷 class H(implicit a:String, b: Int) { //Working } class H(a:String, implicit b: Int) { //Not-Working } class H(implicit a:String, implicit b: Int) { //Not-Working } 在以下两种情况下需要val或var class H2(a:String, implici

我不明白为什么下面三个例子中只有一个有效?是什么使另外两个有缺陷

class H(implicit a:String, b: Int) {
  //Working
}

class H(a:String, implicit b: Int) {
  //Not-Working
}

class H(implicit a:String, implicit b: Int) {
  //Not-Working
}
在以下两种情况下需要val或var

class H2(a:String, implicit val b: Int) {
  //Working
}

class H3(implicit a:String, implicit val b: Int) {
  //Working
}
在以下两种情况下需要val或var

class H2(a:String, implicit val b: Int) {
  //Working
}

class H3(implicit a:String, implicit val b: Int) {
  //Working
}
在第一种情况下,implicit不是指a,而是指整个参数列表。这意味着在调用构造函数时可以隐式地提供a和b,并使它们在类主体中作为隐式对象可用。从这个意义上讲,不能使类或方法的单个参数隐式

隐式的第二个用途是标记类型/对象成员。构造函数参数不是成员,但可以使用val/var将其设置为成员,如pamu的回答所示;或者,为了避免使其可见,private[this]val.

在第一种情况下,implicit不是指a,而是指整个参数列表。这意味着在调用构造函数时可以隐式地提供a和b,并使它们在类主体中作为隐式对象可用。从这个意义上讲,不能使类或方法的单个参数隐式

隐式的第二个用途是标记类型/对象成员。构造函数参数不是成员,但可以使用val/var将其设置为成员,如pamu的回答所示;或者,为了避免使其可见,private[this]val.

classh2a:String,隐式val b:Int将被编译,但实际上不会是隐式@ukasz,但它会在类内声明b隐式。更有趣的事情发生在H3上,其中a和b在内部和外部都是隐式的,构造函数更改为新的H3123456。黑暗的角落,你永远不知道那里隐藏着什么。类H2a:String,隐式val b:Int将编译,但实际上不会是隐式@Łukasz,但它将在类内声明b隐式。更有趣的事情发生在H3上,其中a和b在内部和外部都是隐式的,构造函数更改为新的H3123456。黑暗的角落,你永远不知道那里潜伏着什么。