为什么这段代码不会引起无限递归

时间:2018-08-31 21:36:16

标签: scala

我在网上找到了此代码,并且对其语法有疑问。

https://github.com/playframework/play-mailer/blob/master/play-mailer/src/main/scala/play/api/libs/mailer/MailerClient.scala

问题1-在import play.libs.mailer.{ Email => JEmail, MailerClient => JMailerClient } 行中,我想这是导入重命名,而play.libs.mailer.Email将被称为JEmail,而play.libs.mailer.MailerClient被称为JMailerClient 。为什么要重命名导入?

问题2-在trait MailerClient extends JMailerClient行中,代码同时使用MailerClientJMailerClient,但与MailerClient的{​​{1}}并不相同

问题3-在以下代码中,JMailerClient是未定义的,然后被覆盖,然后在覆盖的函数中,再次调用send!如何运作?

send

1 个答案:

答案 0 :(得分:1)

  1. 如果将play.libs.mailer.Email作为Email导入,则将从该包中隐藏Email类。通过将前者导入为JEmail,后者仍可以称为Email。同样,如果导入的MailerClient不带“ J”,则在此文件中定义的MailerClient只会对其进行阴影处理。加上第7行将变成trait MailerClient extends MailerClient,这显然是个问题,因为现在看起来该特征正在尝试扩展自身。

  2. 否。该定义定义了一个名为MailerClient的特征。该特征扩展了JMailerClient(也称为play.libs.mailer.MailerClient)。 MailerClient是在此处定义的特征,而JMailerClient是正在扩展的接口。

  3. 您将在文件的后面看到,convert返回一个Email对象。因此,调用send(email)不会递归调用第二个send方法(它需要使用JEmail),而是调用已定义的Email对象的重载(作为抽象方法) )在第15行。