Подтвердить что ты не робот

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

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

Кажется, это особенность, а не ошибка, судя по комментарию в источниках scalac:

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

С обычными классами Scala вводит и пустой список параметров либо в объявлении класса (class B), либо в точке экземпляра класса (new A и new 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]