Почему первый список параметров класса не может быть неявным?
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