为什么每个类的 accept 方法内容相同,但不能直接写在父类 SqlNode 中?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
每个类的 accept 方法内容相同,但不能直接写在父类 SqlNode 中,因为这样做会导致所有的 accept 调用都指向 SqlVisitor 中的 visit(SqlNode) 方法(如果该方法存在的话)。由于 Java 的重载是在编译时根据方法的参数类型决定的,而 this 在 accept 方法中的编译时类型是 SqlNode,因此无论实际运行时的对象是哪个子类,都会调用到 visit(SqlNode),从而忽略了具体的子类类型,导致其他重载的 visit 方法形同虚设,不符合预期。