如何在Java中重载处理参数子类的方法?

如何在Java中重载处理参数子类的方法?,java,polymorphism,late-binding,visitor-pattern,Java,Polymorphism,Late Binding,Visitor Pattern,我有一个设计问题,我不知道如何解决。基本上,我使用访问者来更新某个类的实例。我希望将来能够实现不同类型的更新,作为更新类的扩展。我还希望能够更新所有派生自基类的不同类型的对象。因此,我: public class Update { public void visit(A obj) { /* generic */ } public void visit(B obj) { /* specific for B */ } public void visit(C obj) { /*

我有一个设计问题,我不知道如何解决。基本上,我使用访问者来更新某个类的实例。我希望将来能够实现不同类型的更新,作为更新类的扩展。我还希望能够更新所有派生自基类的不同类型的对象。因此,我:

public class Update
{
    public void visit(A obj) { /* generic */ }
    public void visit(B obj) { /* specific for B */ }
    public void visit(C obj) { /* specific for C */ }
}

public class A 
{
    public void accept(Update u) 
    {
        u.visit(this);
    }
}

public class B extends A { /* ... */ }

public class C extends A { /* ... */ }
我在列表中有我的实例,我想对每个对象应用最具体的更新。但是,当我尝试将更新应用于列表的一个元素时,总是调用visitA,而不是更具体的元素。我想这是因为它是列表,而不是列表或列表,但我希望多态性能够解决这个问题。我不能只删除visitA操作符,因为有时不区分C和B是有意义的。您知道如何解决这个问题而不让visitA将消息分派到其重载吗

谢谢

您必须重写accept方法

您必须重写accept方法


您在B和C中也定义了accept吗?@casablanca他没有,否则重载方法将在B和C上调用,而visit将使用预期类型调用。您在B和C中也定义了accept吗?@casablanca他没有,否则重载方法将在B和C上调用,visit将使用预期类型调用。
public class Update
{
    public void visit(A obj) { /* generic */ }
    public void visit(B obj) { /* specific for B */ }
    public void visit(C obj) { /* specific for C */ }
}

public class A 
{
    public void accept(Update u) 
    {
        u.visit(this);
    }
}

public class B extends A {
    public void accept(Update u) 
    {
        u.visit(this);
    }
}

public class C extends A { 
    public void accept(Update u) 
    {
        u.visit(this);
    }
}