2010-07-08 53 views
18
scala> class A(implicit a: Int); 
defined class A 

scala> class B()(implicit a: Int); 
defined class B 

scala> new A()(1) 
res1: A = [email protected] 

scala> new B()(1) 
res2: B = [email protected] 

scala> new A(1) 
<console>:7: error: too many arguments for constructor A:()(implicit a: Int)A 
     new A(1) 

为什么Scalac在类声明中提供的隐式参数列表之前插入一个空的参数列表?为什么不能隐含类的第一个参数列表?

这似乎是一个特性,而不是bug,由commentary in the scalac sources判断:

//转换(隐...)来 ()(隐...)如果只 参数部分

我很想知道为什么这样做。我觉得这很令人惊讶。

回答

7

我看到它的方式是隐式参数列表不会取代常规的参数列表。由于对于构造函数定义,至少需要一个参数列表,如果没有显式指示'()'。

虽然这可能确实令人费解,但它完全符合在完全没有参数列表的情况下生成空的构造函数。

5

好吧,在@ venechka的answer的帮助下,我想我已经明白了。

与普通班,斯卡拉类声明(class B)推断和空参数列表,或者,或者在类实例化(new Anew B)点:

scala> class A() 
defined class A 

scala> new A 
res19: A = [email protected] 

scala> new A() 
res20: A = [email protected] 

scala> class B 
defined class B 

scala> new B 
res21: B = [email protected] 

scala> new B() 
res22: B = [email protected] 

所以要在保持这个原则,它在隐式参数列表(class D(implicit ...))之前推断一个空的参数列表。

scala> class C()(implicit a: Int = 0) 
defined class C 

scala> new C 
res23: C = [email protected] 

scala> new C() 
res24: C = [email protected] 

scala> new C()(0) 
res25: C = [email protected] 

scala> class D(implicit a: Int = 0) 
defined class D 

scala> new D 
res26: D = [email protected] 

scala> new D() 
res27: D = [email protected] 

scala> new D()(0) 
res28: D = [email protected] 
相关问题