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

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 источниках:

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

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

18
задан Ken Bloom 8 July 2010 в 20:18
поделиться

2 ответа

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

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

7
ответ дан 30 November 2019 в 09:27
поделиться

Хорошо, с помощью @ 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
5
ответ дан 30 November 2019 в 09:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: