Почему первый список параметров класса не может быть неявным?

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 вставляет пустой список параметров перед списком неявных параметров, указанным в объявлении класса?

Судя по комментариям в скалярных источниках, это особенность, а не ошибка.

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

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

2 ответа

Решение

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

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

Хорошо, с помощью ответа@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
Другие вопросы по тегам