在完成一些C#和C++项目之后,我开始使用Java。

我想设计访问者界面,如下所示:

public interface ActionVisitor<A> {
    void visitAction(A action);
}

public interface MySmallActionVisitor
extends ActionVisitor<ActionA>,
    ActionVisitor<ActionB>
{

}

public interface MyFullActionVisitor
extends ActionVisitor<ActionA>,
    ActionVisitor<ActionB>,ActionVisitor<ActionC>,ActionVisitor<ActionD> //....
{

}

当然,由于类型擦除,这是行不通的。 (我之所以想要这样的原因是,对于可以访问的不同 Action 组,我将具有不同的访问者界面。)

我想到的唯一解决方案是声明接口(interface)
public interface ActionAVisitor {
        void visitAction(ActionA action);
    }
public interface ActionBVisitor {
        void visitAction(ActionB action);
    }
//...

接着
public interface MySmallActionVisitor
extends ActionAVisitor, ActionBVisitor
{

}

这会起作用,但是我不希望所有ActionXVisitor-Interfaces的声明都是愚蠢的重复和很多文件...

您是否有更好的方法?

非常感谢!

最佳答案

我使用Java中的一个大型复杂库,该库以一种非常整洁的方式广泛使用了Visitor模式。特别是,我遇到了相同的类型擦除问题,现在已经解决了。

如果有机会,请看看an article I've written about this

这是一篇很长的文章,从概念上详细解释了访问者模式的含义,并且在文章的最后部分,我们讨论了一个涉及多态性和类型擦除的现实示例。

干杯

10-02 03:09