**关闭。**此题需要debugging details。目前不接受答复。
编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
19小时前关闭
Improve this question
所以我遇到了一个问题,我已经实现了一个接口的所有4个子类型的方法。但是,当用超类型的变量调用该方法时,它不会让我这样做。我可以显式地使用instanceof来检查一个,但我需要实现一个调用接口的2个示例的函数。
我已经试过分别检查这两个示例并将其转换,但它不起作用。一个解决方案是创建带有16个分支的if-else来检查每个组合,但这并不理想。
public interface FormulaVisitor <Result , AdditionalArg > {
Result visit(Atom formula, AdditionalArg a);
Result visit(BinaryOperator formula , AdditionalArg a);
Result visit(Constant formula , AdditionalArg a);
Result visit(Not formula , AdditionalArg a);
}
2条答案
按热度按时间eqfvzcg81#
我假设你有一个
Formula
接口,它由Atom
、Constant
、BinaryOperator
和Not
实现。因此,在访问者中创建一个接受
Formula
的方法,然后委托给其他方法。所以我会这样写:如果你的接口只有这4个实现,那么就把它设为
sealed
!因为它是接口中的默认方法,所以不必在子类中重新实现它。
在Java中,方法调用在编译时被绑定,因此子类型在编译时无法识别。
ccrfmcuu2#
如果你指的是
Atom
,BinaryOperator
等有一个公共的超类型,你只知道公共的超类型:你运气不好-你不能简单地调用这4个方法并希望得到最好的结果:被调用的确切函数是在编译时静态确定的。
如果你打算实现完整的Visitor pattern,你需要让这4种类型实现对一个适当的访问方法的调用,例如。通过公共超类型声明
accept(Visitor visitor)
,并在每个子类型中实现适当的调用。