我在网上找到了此代码,并且对其语法有疑问。
问题1-在import play.libs.mailer.{ Email => JEmail, MailerClient => JMailerClient }
行中,我想这是导入重命名,而play.libs.mailer.Email
将被称为JEmail
,而play.libs.mailer.MailerClient
被称为JMailerClient
。为什么要重命名导入?
问题2-在trait MailerClient extends JMailerClient
行中,代码同时使用MailerClient
和JMailerClient
,但与MailerClient
的{{1}}并不相同
问题3-在以下代码中,JMailerClient
是未定义的,然后被覆盖,然后在覆盖的函数中,再次调用send
!如何运作?
send
答案 0 :(得分:1)
如果将play.libs.mailer.Email
作为Email
导入,则将从该包中隐藏Email
类。通过将前者导入为JEmail
,后者仍可以称为Email
。同样,如果导入的MailerClient
不带“ J”,则在此文件中定义的MailerClient
只会对其进行阴影处理。加上第7行将变成trait MailerClient extends MailerClient
,这显然是个问题,因为现在看起来该特征正在尝试扩展自身。
否。该定义定义了一个名为MailerClient
的特征。该特征扩展了JMailerClient
(也称为play.libs.mailer.MailerClient
)。 MailerClient
是在此处定义的特征,而JMailerClient
是正在扩展的接口。
您将在文件的后面看到,convert
返回一个Email
对象。因此,调用send(email)
不会递归调用第二个send
方法(它需要使用JEmail
),而是调用已定义的Email
对象的重载(作为抽象方法) )在第15行。