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)
:7: error: too many arguments for constructor A: ()(implicit a: Int)A new A(1) Почему Scalac вставляет пустой список параметров перед неявным списком параметров, предоставленным в объявлении класса?
Это, кажется, функция, не ошибка, судящая комментарием в scalac источниках:
//преобразуйте (неявный...) к () (неявный...), если это - единственный раздел параметра
Мне любопытно знать, почему это сделано. Я нахожу его довольно удивительным.
Как я понимаю, неявный список параметров не заменяет обычный. Поскольку для определения конструктора необходим хотя бы один список параметров, если ничего не указано явно, генерируется '()'.
Хотя это действительно может вызвать недоумение, это соответствует генерации пустого конструктора, когда списки параметров вообще отсутствуют.
Хорошо, с помощью @ 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
Таким образом, чтобы соответствовать этому принципу, он выводит пустой список параметров перед неявным списком параметров ( класс D (неявный ...)
).
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