我想用多态替换switch语句。让我们以PostOffice为例。该邮局发送LetterPackage,它们都是Mail的子类。有几种发送不同类型的Mail的特定方法,因此有一个LetterServicePackageService,两者都是MailService

public class PostOffice {

    @Inject
    private LetterSender letterSender;

    @Inject
    private PackageSender packageSender;

    public void send( Mail mail ) {
        if ( mail instanceof Letter ) {
            letterSender.send( (Letter) mail );
        } else if ( mail instanceof Package ) {
            packageSender.send( (Package) mail );
        }
    }

}


如何避免有条件和instanceof?有人告诉我可以使用多态性删除它们,但是我仍然不明白如何将正确的Mail类型“路由”到正确的MailSender

最佳答案

根据实际逻辑,LetterSenderPackageSender可能确实有两种不同的方法,每种方法都有一个不同的参数。
对于第一个:

 public void send(Letter letter);


对于第二个:

 public void send(Package letter);


要从多态中受益,您应该定义在这两个类实现的接口中定义的通用方法。例如 :

public interface MailSender{
   void send(Mail mail);
}


但是在Java中,overriding的参数不是协变的。因此,您无法通过对Mail参数进行子类型化来实现该接口。
因此,这意味着您必须在两个Sender类中实现void send(Mail mail),例如:

public class LetterSender implements MailSender{
   @Override
   public void send(Mail mail){
      // ...
   }
}

public class PackageSender implements MailSender{
   @Override
   public void send(Mail mail){
      // ...
   }
}


要实现它,您应该从较高的角度定义Mail,在其中定义任何Mail子类所需的行为/方法。
每个Mail子类将为其定义实现。
因此,这两个发送方实现可以处理send(Mail mail)而不需要向下转换参数。

关于java - 如何使用多态将对象映射到助手类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52265690/

10-13 09:48