Почему первый список параметров класса не может быть неявным? - PullRequest
18 голосов
/ 08 июля 2010
scala> class A(implicit a: Int);
defined class A

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

scala> new A()(1)
res1: A = A@159d450

scala> new B()(1)
res2: B = B@171f735

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

Почему Scalac вставляет пустой список параметров перед списком неявных параметров, предоставленным в объявлении класса?

Это, судя по комментарию , функция, а не ошибкаскалярные источники :

// преобразовать (неявный ...) в () (неявный ...), если это единственный раздел параметров

IМне интересно знать, почему это сделано.Я нахожу это довольно удивительным.

Ответы [ 2 ]

7 голосов
/ 12 июля 2010

На мой взгляд, неявный список параметров не заменяет обычный список.Поскольку для определений конструктора необходим по крайней мере один список параметров, если явно не указано ничего, генерируется '()'.

Хотя это может действительно озадачивать, это соответствует генерации пустого конструктора, когда в списке нетвсе присутствующие.

5 голосов
/ 12 июля 2010

Хорошо, с помощью ответа @ venechka , я думаю, что я понял это.

Для обычных классов, Scala выводит и пустой список параметров, либо в объявлении класса (class B), либо в точке создания класса (new A и new B):

scala> class A()
defined class A

scala> new A
res19: A = A@12cdd20

scala> new A()
res20: A = A@1c37b8f

scala> class B
defined class B

scala> new B
res21: B = B@12801c5

scala> new B()
res22: B = B@79a340

Таким образом, чтобы соответствовать этому принципу, он выводит пустой список параметров перед неявным списком параметров (class D(implicit ...)).

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

scala> new C
res23: C = C@9d1714

scala> new C()
res24: C = C@b38dba

scala> new C()(0)
res25: C = C@1677979

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

scala> new D
res26: D = D@1a0d111

scala> new D()
res27: D = D@14e3372

scala> new D()(0)
res28: D = D@1609872
...