使用两种不同的返回类型在Java中实现访问者模式

使用两种不同的返回类型在Java中实现访问者模式,java,visitor-pattern,Java,Visitor Pattern,我正在尝试用java实现一个对象结构的访问者模式(对不起,是home的练习),该对象结构具有不同返回类型(int和void)的方法 concreteVisitor(即,CostAss)返回int,第二个concreteVisitor(即,drawCosts)返回void(即打印成本) 我很难理解如何实现这个问题。我不允许在Employee接口中创建两个accept方法(一个int-e一个void) 从Java的角度来看,这些方法是相同的,因为返回类型不是方法签名的一部分 该图不是为Java设计

我正在尝试用java实现一个对象结构的访问者模式(对不起,是home的练习),该对象结构具有不同返回类型(int和void)的方法

concreteVisitor(即,CostAss)返回int,第二个concreteVisitor(即,drawCosts)返回void(即打印成本)

我很难理解如何实现这个问题。我不允许在Employee接口中创建两个accept方法(一个int-e一个void)


从Java的角度来看,这些方法是相同的,因为返回类型不是方法签名的一部分

该图不是为Java设计的。但是,可以使用泛型来解决它

interface Employee<T> {
  Optional<T> accept(Visitor visitor);
}

class Assistant implements Employee<Integer> {
  @Override
  public Optional<Integer> accept(Visitor visitor) {
    return Optional.of(100);
  }
}

class Manager implements Employee<Void> {
  @Override
  public Optional<Void> accept(Visitor visitor) {
    return Optional.empty();
  }
}
界面员工{
可选择接受(访客);
}
班级助理执行员工培训{
@凌驾
公共可选接受(访客){
返回可选。共(100);
}
}
类管理器实现Employee{
@凌驾
公共可选接受(访客){
返回可选的.empty();
}
}

我不是这个想法的坚定支持者,我只是想分享一下它的实现方式。

您可以使用void类型返回创建一个方法accept,两个具体的访问者有一个状态,例如

public interface IVisitor {

    void visit(Employee employee);

    int getStatus();
}

public class VisitPrint implement IVisitor{

    public void visit(Employee employee){
      //todo
    }    

    public int getStatus(){
        throw new IllegalArgumentException("Not supported operation");
    }
}

public class VisitSum implement IVisitor{

    int status;

    public void visit(Employee employee){
      //todo
    }

    public int getStatus(){
        return status;
    }
}

public interface Employee {
  void accept(Visitor visitor);
}

这种解决方案解决了问题,尊重了教师的心态

这个流程图是从哪里来的?除非更改参数,否则同一方法不能有两种不同的返回类型。谢谢!这是我的问题。我不知道如何处理这种情况。在一个ConcreteVisitor中,我需要返回int。在第二个ConcreteVisitor中,我需要打印值。如果可以用Java解决这个问题。Generics@vincenzopalazzo我不允许在这个练习中使用泛型(教师心态)@GianniSpear试图向你的老师解释,他们共享的图表并不完全适合你(我猜,是自愿)选择的语言。从互联网上获取另一个图表(例如),并实施它。你俩都会从中受益。
public void getStatus(){return status;}
不起作用如果你编译了它,你会看到<代码>执行并且从
void
方法中,可以使用
int
returned@AndrewTobilko绝对是的,非常感谢,我犯了分心的错误。我认为国家的访客是错误的